您的位置:首页 > 其它

VJP1071新年趣事之打牌(背包+输出路径)

2013-08-23 15:59 465 查看
简单的01背包 保存下方案总数 其实就是dp[v]值 输出路径dfs一下

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int dp[100010],w[110],path[110],o,f[110],n;
void dfs(int sw,int v)
{
int j;
if(sw==0)
{
o = v;
return ;
}
for(j = 1; j <= n ; j++)
if(!f[j]&&dp[sw-w[j]])
{
path[v] = j;
f[j] = 1;
dfs(sw-w[j],v+1);
f[j] = 0;
}
}
int main()
{
int i,j,tw;
cin>>tw;
cin>>n;
for(i = 1; i <= n ; i++)
cin>>w[i];
dp[0] = 1;
for(i = 1 ; i <= n ;i++)
for(j = tw ; j>=w[i] ; j--)
{
dp[j] += dp[j-w[i]];
}
int sw = tw;
if(dp[tw]==0)
cout<<"0\n";
else if(dp[tw]>1)
cout<<"-1\n"<<endl;
else
{
dfs(sw,1);
memset(f,0,sizeof(f));
int kk=0;
for(i = 1; i < o ; i++)
f[path[i]] = 1;
for(i = 1; i <= n ;i++)
{
if(!f[i])
{
if(kk)
cout<<" ";
cout<<i;
kk++;
}
}
puts("");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: