poj 1252 Euro Efficiency (01背包变形)
http://poj.org/gotoproblem?pid=1252
(1)不是单纯的01背包问题,硬币有去有回(即有正有负),这使得用想买你的解法,上限难以确定,所以我开了dp[10000]的数组,还未得到好的优化和解释;
(2)对比两种写法:
1)
for(i=1;i<=6;i++)for(j=a[i];j<=N;j++)dp[j]=min(dp[j], dp[j-a[i]]+1); for(i=1;i<=6;i++)for(j=N-a[i];j>=0;j--)dp[j]=min(dp[j], dp[j+a[i]]+1);
2)
for(i=1;i<=6;i++) {for(j=a[i];j<=N;j++)dp[j]=min(dp[j], dp[j-a[i]]+1);for(j=N-a[i];j>=0;j--)dp[j]=min(dp[j], dp[j+a[i]]+1); }
后一种解法是错误的。其实想一想,背包装的都是“正值”,没见过正负混合装的背包,这里所谓的有正有负,其实本质上是两个背包同时起作用的结果,第二个背包的想过直接叠加在第一个上了。
具体代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int N=10000; const int Inf=1<<29; int a[10]; int dp[N+1]; int main() {int i, j, k, t;while(scanf("%d", &t)!=EOF){while(t--){for(i=1;i<=6;i++) scanf("%d", &a[i]);for(i=1;i<=N;i++) dp[i]=Inf;dp[0]=0;for(i=1;i<=6;i++)for(j=a[i];j<=N;j++)dp[j]=min(dp[j], dp[j-a[i]]+1);for(i=1;i<=6;i++)for(j=N-a[i];j>=0;j--)dp[j]=min(dp[j], dp[j+a[i]]+1);int sum=0, Max=-1;for(i=1;i<=100;i++){sum+=dp[i];if(Max<dp[i]) Max=dp[i];}printf("%.2f %d\n", sum/100.0, Max);}}return 0; }
当然,有分别处理两个背包,再由两者组合,查找出最优值,稍微麻烦一些。
具体代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int N=100000; const int Inf=1<<29; int a[10]; int dp[N+1]; int main() {int i, j, k, t;while(scanf("%d", &t)!=EOF){while(t--){for(i=1;i<=6;i++) scanf("%d", &a[i]);for(i=1;i<=N;i++) dp[i]=Inf;dp[0]=0;for(i=1;i<=6;i++)for(j=a[i];j<=N;j++)dp[j]=min(dp[j], dp[j-a[i]]+1);for(i=1;i<=6;i++)for(j=N-a[i];j>=0;j--)dp[j]=min(dp[j], dp[j+a[i]]+1);int sum=0, Max=-1;for(i=1;i<=100;i++){sum+=dp[i];if(Max<dp[i]) Max=dp[i];}printf("%.2f %d\n", sum/100.0, Max);}}return 0; }
转载于:https://www.cnblogs.com/tim11/archive/2012/08/16/2642936.html
poj 1252 Euro Efficiency (01背包变形)相关推荐
- poj 2063 Investment(01背包变形)
http://poj.org/gotoproblem?pid=2063 (1)上限 m 一直上升的 n 次01背包问题,比一般的01背包多了一重循环: (2)本题出现了各种错误:1)刚开始,没注意 m ...
- POJ 1252 Euro Efficiency
背包 要么 BFS 意大利是说给你几个基本的货币,组成 1~100 所有货币,使用基本上的货币量以最小的. 出口 用法概率.和最大使用量. 能够BFS 有可能 . 只是记得数组开大点. 可能会出现 1 ...
- 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 ...
- POJ 3624 Charm Bracelet 0-1背包
传送门:http://poj.org/problem?id=3624 题目大意:XXX去珠宝店,她需要N件首饰,能带的首饰总重量不超过M,要求不超过M的情况下,使首饰的魔力值(D)最大. 0-1背包入 ...
- HDU 2546 饭卡 01背包变形
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- 2022-9-2何以包邮(01背包变形)(c/c++实测满分)
总结: 此题是背包问题的变形,物品的价值和重量有所改变,背包的容量限制有所改变,但核心动态规划求法没有改变.只需要在背包问题的解法上根据题意对物品表示,答案输出进行改变即可. 背包算法 ...
- HDU 3466 01背包变形
给出物品数量N和总钱数M 对于N个物品.每一个物品有其花费p[i], 特殊值q[i],价值v[i] q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品 首先对N个物品进行 q-p的排序,表 ...
- hdu 2184 01背包变形
转自:http://blog.csdn.net/liuqiyao_01/article/details/8753686 题意:这是又是一道01背包的变体,题目要求选出一些牛,使smartness和fu ...
最新文章
- vector容器中erase(删除)的使用
- 让SpringBoot不再需要Controller、Service、Mapper,这款开源工具绝了!!!
- [原创]windows server 2012 AD架构 试验 系列 – 11AD域和站点部署(2)
- Spring boot项目整合Hadoop的HDFS
- 在网上收集了一部分关于使用Google API进行手机定位的资料和大家分享
- 写出表格的结构html,一个面试题,根据json结构生成html表格
- python字典实现原理_python学习笔记_第7天(字典底层原理+选择结构)
- java图片简单爬虫_[Java教程]使用jsoup进行简单的爬虫操作爬取图片
- 基于spring-boot的社区社交微信小程序,适合做脚手架、二次开发
- java两种不同单例模式_关于Java里的两种单例模式
- 程序猿的执业修养(七)——不要卖弄,多思慎言
- 神策2021秋招数据分析笔试
- 原核DNA甲基化简述
- Lenovo y50-70 黑苹果hackintosh 10.14.4 Mojave 更新后开机黑屏,引导失败,无法开机
- 开始学习python了鸭
- linux 多线程 压缩,24、Linux 多线程压缩工具pigz 的学习
- 【微信小程序】获取用户头像和ID
- 51nod 1205 流水线调度(Johnson规则)
- python知道三角形三边求面积(海伦公式)
- 微信转发后链接中不显示缩略图
热门文章
- 老男孩和门户网站学生聊天整理
- java文件选择器_java中文件选择器JFileChooser的用法
- python文件传输模块_[宜配屋]听图阁 - python 使用poster模块进行http方式的文件传输到服务器的方法...
- pandas分组计算平均值_python – 如何计算在Pandas中另一列上分组的平均值
- highCharts如何实现json数组数据的图形展示
- javascript:void(0)
- ts怎么转换成m3u8直播源_HLS及M3U8介绍
- atm机存款场景图_被ATM机吞掉的钱
- mysql flask-login_Flask框架通过Flask_login实现用户登录功能示例
- 华为双系统手机可以刷成单系统_「冯站长之家」今日聚焦:重大突破!华为手机鸿蒙系统2.0,正式面世!骂华为的“喷子”,可以休矣!...