新年趣事之打牌----VIJOS_1071----01背包加强版
2012-09-23 18:13
369 查看
题目地址:http://www.vijos.org/Problem_show.asp?id=1071
270
4
100
110
170
200
样例输出 Sample Output
2 4
首先要理解题目的意思。这个题目的意思是说,现在有一堆丢失了的牌,知道他们的总重量,然后知道每一种牌的重量,要你求到底是丢失了哪几张牌。如果无法确定则输出0,如果有很多种情况,则输出-1,否则按牌号的大小一次输出缺的牌。
由于本题目引入了重量的概念,所以既然剩下的牌的总重量知道,那我只需要用01背包方法求出怎样才能用给出的牌种组成剩下的牌,没拿进来的牌就是缺的牌。只不过我们要对这个做一个记录。记录哪些牌拿进来了,哪些没有。用一个数组judge[i]来记录是否加进来了。用数组num[v]来记录当把容量为V的正好装满的时候所用的牌的牌号i,用dp[v]来表示装满容量为v的所有方案数。初值dp[0]=1,其余为0.下面上代码更容易懂。
代码:
系列 | ||
|
4
100
110
170
200
样例输出 Sample Output
2 4
首先要理解题目的意思。这个题目的意思是说,现在有一堆丢失了的牌,知道他们的总重量,然后知道每一种牌的重量,要你求到底是丢失了哪几张牌。如果无法确定则输出0,如果有很多种情况,则输出-1,否则按牌号的大小一次输出缺的牌。
由于本题目引入了重量的概念,所以既然剩下的牌的总重量知道,那我只需要用01背包方法求出怎样才能用给出的牌种组成剩下的牌,没拿进来的牌就是缺的牌。只不过我们要对这个做一个记录。记录哪些牌拿进来了,哪些没有。用一个数组judge[i]来记录是否加进来了。用数组num[v]来记录当把容量为V的正好装满的时候所用的牌的牌号i,用dp[v]来表示装满容量为v的所有方案数。初值dp[0]=1,其余为0.下面上代码更容易懂。
代码:
#include<iostream> using namespace std; int w[110]; bool ans[110]; int path[100010]; int dp[100010]; int main() { int total,n,i,j; while(scanf("%d",&total)!=EOF) { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&w[i]); } memset(dp,0,sizeof(dp)); memset(ans,true,sizeof(ans)); dp[0]=1; for(i=1;i<=n;i++) for(j=total;j>=w[i];j--) if(dp[j-w[i]]>0) { if(dp[j]==0) path[j]=i; dp[j]+=dp[j-w[i]]; } if(dp[total]==0) { printf("0\n");break;} if(dp[total]>1) { printf("-1\n");break;} i=total; while(i>0) { ans[path[i]]=false; i=i-w[path[i]]; } for(i=1;i<=n;i++) if(ans[i]) printf("%d ",i); printf("\n"); } return 0; }
相关文章推荐
- 新年趣事之打牌----VIJOS_1071----01背包加强版
- vijos 1071 新年趣事之打牌
- 1090. [Vijos 1071] 新年趣事之打牌
- 1071新年趣事之打牌——vijos
- vijosP1071 新年趣事之打牌
- 1071.新年趣事之打牌
- VJP1071新年趣事之打牌(背包+输出路径)
- Vijos - P1071 新年趣事之打牌
- Vijos P1071新年趣事之打牌
- vijosP1071 新年趣事之打牌
- 【动态规划】Vijos P1071 新年趣事之打牌
- Vijos P1071 新年趣事之打牌
- vijos1071:新年趣事之打牌
- 新年趣事之打牌_DP
- [vijos1072] 新年趣事之债务
- vijos1025 小飞侠的游园方案(01背包模板)
- vijos 1069 新年趣事之红包(区间DP)
- Vijos 1069 新年趣事之红包(动态规划最短路)
- Vijos 1072题:新年趣事之债务
- Vijos 1334 ---- NASA的食物计划(01背包强化)