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

时间:2023-03-09 05:56:50
VJP1071新年趣事之打牌(背包+输出路径)

简单的01背包 保存下方案总数 其实就是dp[v]值 输出路径dfs一下

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