POJ-1276-Cash Machine-多重背包
2015-08-21 16:15
330 查看
题目大意:
有各种不同面值的货币,每种面值的货币有不同的数量,请找出利用这些货币可以凑成的最接近且小于等于给定的数字cash的金额。
思路:
转化为01背包
转化为完全背包
1.01背包
有各种不同面值的货币,每种面值的货币有不同的数量,请找出利用这些货币可以凑成的最接近且小于等于给定的数字cash的金额。
思路:
转化为01背包
转化为完全背包
1.01背包
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[110000], t[30000], s[2000][2]; int main() { int cash, n; while(~scanf("%d%d",&cash,&n)&&(cash+n)) { int cnt = 0; for(int i=1; i <= n;i++) { scanf("%d%d",&s[i][0],&s[i][1]); int k=1; if(s[i][0]==0||s[i][1]==0) continue; while(s[i][0]-k>0) { t[cnt++] = k*s[i][1];///转化 s[i][0] -=k; k*=2; } t[cnt++]=s[i][0]*s[i][1]; } memset(dp,0,sizeof(dp)); for(int i = 0; i < cnt; i++) { for(int j = cash; j>=t[i];j--) { if(dp[j]<dp[j-t[i]]+t[i]) dp[j]=dp[j-t[i]]+t[i]; } } printf("%d\n",dp[cash]); } return 0; }2.完全背包
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dp[110000]; int t[100100];///转换为完全背包的控制次数 int s[2000][2]; int main() { int cash, n; while(~scanf("%d%d",&cash,&n)&&(cash+n)) { for(int i=1; i <= n;i++) { scanf("%d%d",&s[i][0],&s[i][1]); } memset(dp,0,sizeof(dp)); for(int i = 1; i <= n; i++) { memset(t,0,sizeof(t)); for(int j = s[i][1]; j<=cash;j++) { if(dp[j]<dp[j-s[i][1]]+s[i][1]&&t[j-s[i][1]]<s[i][0]) { dp[j] = dp[j-s[i][1]]+s[i][1]; t[j] = t[j-s[i][1]]+1; } } } printf("%d\n",dp[cash]); } return 0; }
相关文章推荐
- Android应用程序优化大总结
- 个人--返场的艺术
- Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本
- 线程同步互斥之互斥量(Mutex)
- MySql查询总结
- 关于打开MTK_SDCARD_SWAP 宏后MTK目前升级方案和 关于打开MTK_SHARED_SDCARD宏后MTK目前升级方案
- Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本
- php匹配字符串中大写字母的位置
- CRB and His Birthday(背包)
- 单例模式 创建对象
- Fastboot线刷“复活”之刷机心得(三)——错误处理
- 查询sql时获取当前记录行数
- tomcat 虚拟目录配置
- 相册的实现
- BZOJ 1588 营业额统计 (Splay Tree)
- MDT 2013 Update 1 新功能变化
- python-导包
- 在上传文件时限制上传文件的大小,并捕捉超过文件大小限制的异常
- Android常见的按钮监听器实现方式
- VC6录音程序移植至VS2010