最简单的DP问题3——hdu2191
来源:互联网 发布:知乎日报 rss源 编辑:程序博客网 时间:2024/06/04 18:37
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191
中文题。
多重背包,并且用2进制来优化。
详情看注释,重点部分写的很详细了
#include<stdio.h>#define max(a,b) ((a)>(b))?(a):(b)int t;int n, m;int value[105], weight[105], num[105];int dp[105];int main(){ int i,j,k; scanf("%d", &t); while(t--) { for(i = 0 ; i < 105 ; i++) dp[i] = 0; scanf("%d %d", &n, &m); for(i=1; i<=m; ++i)//每输入一种处理一次 { scanf("%d %d %d", &value[i], &weight[i], &num[i]); //如果这种粮食总价格大于等于预算相当于无限取用 //这种情况下你把钱花光的最好结果也是刚好买完这种粮食 //故使用完全背包 if(num[i] * value[i] >= n) { for(j = value[i] ; j <= n ; j++) dp[j] = max(dp[j],dp[j-value[i]]+weight[i]); } else//不然使用01背包法 { //二进制优化:一个整数一定可以化为二进制+余数 //举个例子 16 == 1+2+4+8 +1 //循环算的话需要16次,优化后只算5次。数越大节省时间越多 for(k = 1 ; k < num[i]; num[i]-=k , k*=2) for(j=n; j>=k*value[i]; j--) dp[j] = max(dp[j],dp[j-k*value[i]]+k*weight[i]); //处理二进制化后的余数部分 for(j = n ; j >= num[i]*value[i] ; j--) dp[j] = max(dp[j],dp[j-num[i]*value[i]]+num[i]*weight[i]); } } printf("%d\n", dp[n]); } return 0;}
0 0
- 最简单的DP问题3——hdu2191
- 最简单的dp问题(1)——hdu2602
- 最简单的DP问题2——hdu1114
- 最简单的DP问题(POJ1163)
- 【HDU2191】悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包/简单DP)
- C++ 求矩阵最短路问题最简单最暴力的dp解法
- 【DP(背包)】 hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
- DP--多重背包--HDU2191
- Python100例——第一章----最简单的问题
- HDU 2602——最简单的背包问题
- HDU2191多重背包问题
- hdu2191 多重背包问题
- HDU2191(单调队列优化DP)
- HDU2191 DP + 裸 + 多重背包
- hdu2191 多重背包(dp)
- 最简单的栈问题
- 最简单的背包问题
- 最简单的博弈问题
- 使用命令行创建并运行android apk
- 第八周项目 三 (2) 终于完成了
- 美化开放厨房
- Android 调用照相机,获取的图片太小
- 从服务器将ORACLE数据库导出和导入本地oracle数据库中的方法
- 最简单的DP问题3——hdu2191
- SODBASE CEP学习(九):SODBASE View 实时图表显示和移动端消息
- struts2--使用自带标签自动添加列表
- JAVA开发_EXCEL文件解析
- unity中判断渲染物体是否在摄像机内渲染
- 数据存储
- java web 获取各种路径
- node+express 项目中安装ejs模板引擎
- 快速排序的实现