标签:
Description
Input
Output
Sample Input
| input | output |
|---|---|
270 4 100 110 170 200 |
2 4 |
270 4 100 110 160 170 |
-1 |
270 4 100 120 160 180 |
0 |
大意:输入一个m,表示当前剩下的纸牌的重量,接下来n行表示完整的牌的重量,每种牌只有一张,让你求缺少的牌是哪些。
用所有的牌的总重量减去当前不完整牌的重量,就是所缺少的牌的重量,然后进行01背包,不过dp记录的是情况数目所以回溯的时候不能用i = path[i],只能枚举倒着递推
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int w[110];
int dp[100100];
int path[100100];
int print[110];
int main()
{
int m,n;
while(~scanf("%d%d",&m,&n)){
int sum = 0;
for(int i = 1; i <= n ; i++){
scanf("%d",&w[i]);
sum += w[i];
}
memset(dp,0,sizeof(dp));
dp[0] = 1;
sum -= m;
for(int i = 1; i <= n ;i++){
for(int j = sum - w[i]; j >= 0 ;j--){
if(dp[j]){
if(!dp[j+w[i]])
path[j+w[i]] = i;
dp[j+w[i]] += dp[j];
}
}
}
if(dp[sum] == 0)
printf("0\n");
else if(dp[sum] == 1){
int j = 1;
for(int i = n ; i >= 1; i --){
if(path[sum] == i){
print[j++] = i;
sum -= w[i];
}
}
for(int i = j - 1; i > 1;i--)
printf("%d ",print[i]);
printf("%d\n",print[1]);
}
else printf("-1\n");
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4497157.html