HDU - 2126 Buy the souvenirs
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; /**************************************************************************************************************** 题意:一个变形的 0/1 背包,n个物品,m元钱,每个物品最多买一次, 问最多可以买几件物品,并且输出方案数。 思路: 1,加一维表示已经买几件物品。 2,用了一个数组dp[v][2] ,dp[v][0] 储存原本要记录的 dp ,即最多能买多少种 而 dp[v][1] 则记录方案数目。记住需要初始化,把所有 dp[i][1] 都设置成1 3,体会: 用了网上的 C 提交了一下,发现 run time是0; 然后用自己的C++提交了一下,发现 run time是31MS. 以后试试使用C的输入输出,果然会快很多呢!!!!!! ****************************************************************************************************************/ int a[35]; int dp[505][2]; int main() { int T,N,V; cin>>T; while(T--) { cin>>N>>V; for(int i = 1;i <= N;i ++) cin>>a[i]; memset(dp,0,sizeof(dp)); for(int i = 0;i <= V;i ++) dp[i][1]=1; for(int i = 1;i <= N;i ++){ for(int j = V;j >= a[i];j --){ if(dp[j][0] == dp[j-a[i]][0]+1) dp[j][1]+=dp[j-a[i]][1]; else if(dp[j][0] < dp[j-a[i]][0]+1){ dp[j][0]=dp[j-a[i]][0]+1; dp[j][1]=dp[j-a[i]][1]; } } } if(dp[V][0]) cout<<"You have "<<dp[V][1]<<" selection(s) to buy with "<<dp[V][0]<<" kind(s) of souvenirs."<<endl; else cout<<"Sorry, you can't buy anything."<<endl; } return 0; }