您的位置:首页 > 其它

HDU - 2126 Buy the souvenirs

2016-04-23 23:29 387 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: