POJ 3260 多重背包+完全背包
前几天刚回到家却发现家里没网线 && 路由器都被带走了,无奈之下只好铤而走险尝试蹭隔壁家的WiFi,不试不知道,一试吓一跳,用个手机软件简简单单就连上了,然后在浏览器输入192.168.1.1就能看到他的路由器的一切信息,包括密码,然后打开笔记本……好了,废话不多说,能连上网后第一时间当然是继续和队友之前约好的训练了。
今天翻看到之前落下的一道混合背包题目,然后在草稿本上慢慢地写递推方程,把一些细节细心地写好…(本来不用太费时间的,可是在家嘛,一会儿妈走来要我教她玩手机,一会儿有一个亲戚朋友来……简直无语了,程序猿最讨厌被人打断的!虽说我不是码农)然后,这道题,细心分析后,发现它是多重背包+完全背包的。
首先,可以先顺着推出 John手中的coin能拼凑出的币值的最小币数,即设dp[i][j]为前 i 种coin凑出币值 j 时需要的最小币数,很明显,dp[i][j]= min(dp[i-1][j], dp[i][j-coin[i]]+1) 的递推方程很容易想到,但是,这个方程在使用前需要满足很多情况,具体的细节就看代码了(全部都进行了空间优化,其中need数组表示前 i 种coin凑出币值 j 需要的最小币数时,需要的coin[i]的数量),因为之前看过《挑战》中多重背包的实现,所以这个稍微变化一下也不是很难了。
然后,到了收银员找币时的情况,因为题目中说了她会提供无限的零钱,所以此时就是完全背包了,注意好计算顺序即可:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn= ; int dp[maxn+], coin[],num[], need[maxn+]; int main(){
int n,t,i,j;
while(~scanf("%d%d",&n,&t)){
for(i=; i<=n; ++i)
scanf("%d",coin+i);
for(i=; i<=n; ++i)
scanf("%d",num+i);
memset(dp,-,sizeof(dp));
dp[]= ;
for(i=; i<=n; ++i){
memset(need,,sizeof(need));
for(j=; j<=maxn; ++j)
if(j>=coin[i]&& dp[j-coin[i]]!= - && need[j-coin[i]]<num[i]){
if(dp[j]== - || dp[j]> dp[j-coin[i]]+){
dp[j]= dp[j-coin[i]]+;
need[j]= need[j-coin[i]]+;
}
}
}
for(i=; i<=n; ++i)
for(j=maxn-coin[i]; j>=; --j)
if(dp[j+coin[i]]!= -){
if(dp[j]== -) dp[j]= dp[j+coin[i]]+;
else dp[j]= min(dp[j],dp[j+coin[i]]+);
}
printf("%d\n",dp[t]);
}
return ;
}
因为一开始没用到need数组所以调试了一会儿,然后今早起来想了想发现昨晚写的need数组有问题,不知是数据弱还是怎么的也能过,改了下后提交发现:

竟然排到了16名,第一次这么前。
后来又想了想,dp数组如果用INF而不是-1来作为凑不出币值 j 的标记的话,代码会更简单一些:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int INF= 0x3fffffff;
const int maxn= ; int dp[maxn+], coin[],num[], need[maxn+]; int main(){
int n,t,i,j;
while(~scanf("%d%d",&n,&t)){
for(i=; i<=n; ++i)
scanf("%d",coin+i);
for(i=; i<=n; ++i)
scanf("%d",num+i);
for(j=; j<=maxn; ++j)
dp[j]= INF;
dp[]= ;
for(i=; i<=n; ++i){
memset(need,,sizeof(need));
for(j=; j<=maxn; ++j)
if(j>=coin[i] && need[j-coin[i]]<num[i]){
if(dp[j]> dp[j-coin[i]]+){
dp[j]= dp[j-coin[i]]+;
need[j]= need[j-coin[i]]+;
}
}
}
for(i=; i<=n; ++i)
for(j=maxn-coin[i]; j>=; --j)
dp[j]= min(dp[j],dp[j+coin[i]]+);
printf("%d\n",dp[t]==INF? -:dp[t]);
}
return ;
}
虽然比起上一个慢了点可以忽略不计的时间:

anyway,人生第一道AC掉的混合背包,值得纪念,背包问题,继续进取中~~
POJ 3260 多重背包+完全背包的更多相关文章
- POJ 3260 The Fewest Coins(多重背包+全然背包)
POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...
- POJ 3260 The Fewest Coins(完全背包+多重背包=混合背包)
题目代号:POJ 3260 题目链接:http://poj.org/problem?id=3260 The Fewest Coins Time Limit: 2000MS Memory Limit: ...
- POJ 1745 【0/1 背包】
题目链接:http://poj.org/problem?id=1745 Divisibility Time Limit: 1000MS Memory Limit: 10000K Total Sub ...
- 【poj3260-最少找零】多重背包+完全背包
多重背包+完全背包. 买家:多重背包:售货员:完全背包: 开两个数组,分别计算出买家,售货员每个面额的最少张数. 最重要的是上界的处理:上界为maxw*maxw+m(maxw最大面额的纸币). (网上 ...
- POJ 3181 Dollar Dayz(全然背包+简单高精度加法)
POJ 3181 Dollar Dayz(全然背包+简单高精度加法) id=3181">http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币各自 ...
- HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)
HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...
- POJ 3211 Washing Clothes(01背包)
POJ 3211 Washing Clothes(01背包) http://poj.org/problem?id=3211 题意: 有m (1~10)种不同颜色的衣服总共n (1~100)件.Dear ...
- DP专题·三(01背包+完全背包)
1.hdu 2126 Buy the souvenirs 题意:给出若干个纪念品的价格,求在能购买的纪念品的数目最大的情况下的购买方案. 思路:01背包+记录方案. #include<iostr ...
- The Fewest Coins POJ - 3260
The Fewest Coins POJ - 3260 完全背包+多重背包.基本思路是先通过背包分开求出"付出"指定数量钱和"找"指定数量钱时用的硬币数量最小值 ...
随机推荐
- 从invoke简单理解反射
前言 程序集 : 程序集是.NET应用程序的基本单位,包含了程序的资源.类型元数据和MSIL代码.根据程序集生成方式的不同,可分为静态程序集和动态程序集.程序集又可分为单文件程序集和多文件程序集, ...
- SQL-字符串合并
create table tb(id int, value varchar(10)) insert into tb values(1, 'aa') insert into tb values(1, ...
- Linux内核同步机制
http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环 ...
- C# 错误代码
附录B 错误CS0001 编译器内部错误 错误CS0003 内存溢出 错误CS0004 提升为错误的警告 错误CS0005 编译器选项后应跟正确的参数 错误CS0006 找不到动态链接的元数据文件 错 ...
- java中局部变量和成员变量主要是他们作用域的区别
成员变量个是类内部:局部变量是定义其的方法体内部(或者方法体内部的某一程序块内——大括号,主要看定义的位置).另外,成员变量可以不显式初始化,它们可以由系统设定默认值:局部变量没有默认值,所以必须设定 ...
- Python3基础 assert关键字 成功啥事没有,失败了就报错
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 如何重置CentOS/RHEL 7中遗忘的根用户帐户密码
你有没有遇到过这种情况:想不起来Linux系统上的用户帐户密码?要是你忘了根用户密码,情况就更为糟糕.你无法执行任何面向整个系统的变更.要是你忘了用户密码,很容易使用根帐户来重置密码. 可要是你忘了根 ...
- iOS开发,推送消息 steps
概述:推送过程简介 一.App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请. ...
- VS2013自动注释插件
在程序编写的时候,你是否见过这种写法?整个项目每个cs文件头部都包含一个,版权,版本等信息的注释头? 类似这个类文件: /*************************************** ...
- vb6.0安装程序制作图解教程
如何制作vb安装程序,是在学习Vb6.0过程中比较常见的一个入门问题. 在此笔者介绍一个最简单的安装方法,就是用VB自带的打包程序进行打包,虽然比较普通,不过内部却有不少窍门,相信这一点知道的人可能不 ...