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;
}
#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;
}
相关文章推荐
- Leetcode #53. Maximum Subarray 最大区间和 解题报告
- 今年要读的书
- Edison PuTTY启动报警
- 两个等长数组2n个数,找出中位数
- python数据类型之str用法
- [读书笔记] CSS权威指南1: 选择器
- phpwind < v6 版本命令执行漏洞
- awk 中使用 OFS.
- HDU - 2955 Robberies
- 2016.4.23 低空贴近零基础开发Android遇到的问题(一)
- Android图片选择器、多选框架
- mysql 做增量备份
- 116.Reverse Vowels of a String
- 生活感悟2016-4-23
- 第一次冲刺阶段(六)
- nyoj 86 找球号(一)<水,二分>
- zoj-3946-Highway Project【13th浙江省赛】【最短路】
- [算法练习]找出40000以内的素数
- ubuntu 软件安装和配置
- opencv2.4.9在visual studio 2013中的配置