题目:
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define MAX 2000005
int dp[MAX],a[MAX],path[MAX],res;
void print(int k)
{
if(k){
print(k - a[path[k]]);//找到上一个质量
if(k == res) cout << path[k];//最后一个不输出空格
else cout << path[k] << " ";
}
}
int main()
{
int total,n,sum = 0;
cin >> total >> n;
for(int i = 1;i <= n;i++) cin >> a[i],sum += a[i];
res = sum - total;//res代表丢失牌总质量
dp[0] = 1;//dp[i]代表丢失质量为i的牌的可能数
for(int i = 1;i <= n;i++){
for(int j = res;j >= a[i];j--){
dp[j] += dp[j - a[i]];
if(dp[j] > 5) dp[j] = 2;//这里不关心方案数,为了防止数量过大需要及时缩小
if(!path[j] && dp[j - a[i]]) path[j] = i;//path[j]代表达到重量j时需要第i张牌
}
}
if(!dp[res]) cout << "0" << endl;
else if(dp[res] > 1) cout << "-1" << endl;
else print(res);
return 0;
}
就是一道0 - 1背包问题,单数这里需要记录过程,所以用到path数组,最后递归打印。