HDU 5410 CRB and His Birthday ——(完全背包变形)
对于每个物品,如果购买,价值为A[i]*x+B[i]的背包问题。
先写了一发是WA的= =。代码如下:
1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <set> 5 using namespace std; 6 typedef pair<int,int> pii; 7 8 pii dp[2005]; 9 int w[1005],A[1005],B[1005]; 10 11 int main() 12 { 13 int T;scanf("%d",&T); 14 while(T--) 15 { 16 int m,n;scanf("%d%d",&m,&n); 17 for(int i=1;i<=n;i++) scanf("%d%d%d",w+i,A+i,B+i); 18 for(int i=0;i<=m;i++) dp[i] = pii(0,0); 19 for(int i=1;i<=n;i++) 20 { 21 for(int j=0;j<=m;j++) dp[j] = pii(dp[j].first, 0); 22 for(int j=w[i];j<=m;j++) 23 { 24 if(dp[j-w[i]].first + A[i] + (dp[j-w[i]].second == 0 ? B[i] : 0) > dp[j].first) 25 { 26 dp[j].first = dp[j-w[i]].first + A[i] + (dp[j-w[i]].second == 0 ? B[i] : 0); 27 dp[j].second = 1; 28 } 29 } 30 } 31 printf("%d\n",dp[m].first); 32 } 33 return 0; 34 }
正解是,先跑一遍价值为A[i]+B[i]的01背包,再跑一遍价值为A[i]完全背包。所以上面的代码错了大概是因为,这两个背包的第二个for的方向是不同的,没办法一起跑吧(除非用另外一组变量记录下到前一个为止的dp值,然后就可以同时跑了)。。对背包问题的理解还是不够深啊。。
————————————————————————————————————————————————————————
想了一下,感觉上面说的括号里的再用一个数组记录的方法貌似不太对。。虽然那份代码AC了- -。。反正跑两遍的方法肯定是对的。。我说的是这个博客里面的第二个方法:http://www.cnblogs.com/wmxl/p/4749780.html。也有可能是我对完全背包的理解不够深刻。。先放着再说好了。。
————————————————————————————————————————————————————————
AC代码如下:
1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <set> 5 using namespace std; 6 typedef pair<int,int> pii; 7 8 int dp[2005]; 9 int w[1005],A[1005],B[1005]; 10 11 int main() 12 { 13 int T;scanf("%d",&T); 14 while(T--) 15 { 16 int m,n;scanf("%d%d",&m,&n); 17 for(int i=1;i<=n;i++) scanf("%d%d%d",w+i,A+i,B+i); 18 memset(dp,0,sizeof(dp)); 19 for(int i=1;i<=n;i++) 20 { 21 for(int j=m;j>=w[i];j--) dp[j] = max(dp[j], dp[j-w[i]] + A[i] + B[i]); 22 for(int j=w[i];j<=m;j++) dp[j] = max(dp[j], dp[j-w[i]] + A[i]); 23 } 24 printf("%d\n",dp[m]); 25 } 26 return 0; 27 }
转载于:https://www.cnblogs.com/zzyDS/p/6188175.html
HDU 5410 CRB and His Birthday ——(完全背包变形)相关推荐
- HDU 5410 CRB and His Birthday
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5410 Problem Description Today is CRB's birthday. His ...
- codeforce Gym 101102A Coins (01背包变形)
01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...
- P1734 最大约数和 01背包变形
传送门 思路:01背包变形题.将i看成重量,i的因子看成价值即可.背包自然是s. /** * From: * Qingdao Agricultural University * Created by ...
- HDU Problem 2062 Bone Collector【01背包】
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 5410(背包问题变形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5410 解题思路:令dp[i][j][0]表示前i种物品,共j钱,不买第i种物品所能买到的最大值.dp[ ...
- 5410 ACM 杭电 01+完全背包
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5410 虽然是英文题目:但还是很好理解的.明显的背包问题 思路:如果你能想到把题目拆分成小问题,就会简单许多 ...
- HDU 2546 饭卡 01背包变形
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- hdu 2546 饭卡【贪心+01背包基础题】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2546 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU 1114—Piggy-Bank(储蓄罐)(完全背包)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 题意 开始时输入T,代表一共有T个样例. 对于每一个样例,第一行给出E与F(1<=E,F< ...
最新文章
- 微信读书vscode插件_快来!让这款 VSCode 插件吹爆你的彩虹屁!
- sqlserver怎么查看索引_Sql Server之旅——第六站 为什么都说状态少的字段不能建索引...
- 实测:xml与json速度约差4倍
- php 文件扫描去重,PHP中的去重方法详解和文件下载
- EntityFramework 7 OrderBy Skip Take-计算排序分页 SQL 翻译
- mysql程序设计排球比赛_Jsp+Ssh+Mysql实现的排球馆预约管理系统项目源码附带视频指导运行教程...
- vue 前期准备,项目结构
- Ubuntu创建快捷方式
- 开源监控系统------Zabbix
- Hibernate学习资源
- Java安全生态-Java加解密API详解-Java安全框架官方文档翻译:对称/非对称加密、数字签名、数字证书、安全通信、密钥库等
- 如何用Qlikview在dashboard中创建条形图时,统计时忽略空值
- 【MineCraft】-- 如何开设我的世界服务器
- 李德毅院士:大数据认知
- 果汁机器人传销_【调查】“洋果汁治百病”?然健环球涉嫌传销大起底
- [Baltic2008]Mafia
- 弘辽科技:拼多多直通车关键词推广问题的细说讲解
- 《一胜九败3》李彦宏百度在试错中前行-读书笔记
- 轻巧画图工具_Web的轻巧灵活的表格组件
- Python3.X 调用百度翻译API和有道翻译API
热门文章
- 命运2服务器维护时间2019,《命运2》今晚将停机维护 为多平台共用存档做准备...
- 使用github+jsdelivr作为视频床
- 多进程鱼多线程的权衡选择
- Linux(13)-文件权限,chmod
- Python(10)- 格式化输出%
- 《Java8实战》笔记(13):函数式的思考
- 小米用户画像_企鹅智库:高学历用苹果中老年用华为 男性用小米女性用OV
- iphone全部机型_iPhone 12 销量或创 iPhone 6 以来最高|iphone|郭明錤
- 数学建模1 赛前准备 赛题选择 查找文献
- 编程语言大比拼——谁的效率高