标签:
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