HDU3591找零,背包
题目大概的意思就是:小强用硬币买东西,硬币有N种,面值为Vi,店家有各种硬币都有无限个,而小强只有Ci个(分别对应Vi)
问最小交易硬币数,就是一个有找零的背包问题啦。
我的上一篇博客跟这hdu3591的类型非常非常接近,所以我很快就写完,并且很快地WA了无数次。
后来很苦恼,看看别人写的代码,他们的思想大概是这样子。用dp2去记载找零,就是dp2[i]=min{dp2[i],dp2[i-V]+1 } V为要付的总款
之后再从V到INF处得到ans=min{ans,dp[i]+dp2[i-V]};
思路是很清晰啦,很快我又CODE了一段。
马上又WA了无数次。
正当我无力时候,我发现!!!!原来是我的ZeroOnePack的参数写错了...第二个版本,改了参数后,马上就Accepted了!!!!!!!
先发个第二个版本的。
#include"stdio.h"
#include"string.h"
#define m 105
#define m3 20005
int V=m3;
int N;
int c[m],n[m],dp[m3+1],dp2[m3+1];
int min(int a,int b){
return a<b?a:b ;
}
void ZeroOnePack(int vol,int val){
int i;
for(i=V;i>=vol;i--)
dp[i]=min(dp[i],dp[i-vol]+val); }
void CompletePack(int vol,int val){
int i;
for(i=vol;i<=V;i++)
dp[i]=min(dp[i],dp[i-vol]+val); }
void MultPack(int vol,int val,int num){
int k;
if(num*vol>=V){
CompletePack(vol,val);
return ;
}
k=1;
while(k<num){
ZeroOnePack(k*vol,k*val);
num-=k;
k<<=1; }
ZeroOnePack(num*vol,num*val); } int main(){
int i,j,V1,ca=1,ans; while(scanf("%d%d",&N,&V1)&&(N||V1)){
memset(dp,63,sizeof(dp));
dp[0]=0;
memset(dp2,63,sizeof(dp2));
dp2[0]=0;
for(i=1;i<=N;i++)
scanf("%d",&c[i]);
for(i=1;i<=N;i++)
scanf("%d",&n[i]); //给钱
for(i=1;i<=N;i++)
MultPack(c[i],1,n[i]); //找零
for(i=1;i<=N;i++)
for(j=c[i];j<=V;j++)
dp2[j]=min(dp2[j],dp2[j-c[i]]+1);
ans=0xfffffff;
for(i=V1;i<=V;i++)
ans=min(ans,dp[i]+dp2[i-V1]); printf("Case %d: %d\n",ca++,ans==0xfffffff?-1:ans); }; return 0; }
| 10325750 | 2014-03-17 22:21:06 | Accepted | 3591 | 78MS | 388K | 1403 B | C | deron |
后来,我又把我第一个版本给改了一下,交了。毫无问题,Accepted
#include"stdio.h"
#include"string.h"
#define m 103
#define m3 20003 int V=m3;
int N;
int c[m],n[m],dp[m3+1];
int min(int a,int b){
return a<b?a:b ;
}
void ZeroOnePack(int vol,int val){
int i;
for(i=V;i>=vol;i--)
dp[i]=min(dp[i],dp[i-vol]+val); }
void CompletePack(int vol,int val){
int i;
for(i=vol;i<=V;i++)
dp[i]=min(dp[i],dp[i-vol]+val); }
void MultPack(int vol,int val,int num){
int k;
if(num*vol>=V){
CompletePack(vol,val);
return ;
}
k=1;
while(k<num){
ZeroOnePack(k*vol,k*val);
num-=k;
k<<=1; }
ZeroOnePack(num*vol,num*val); } int main(){
int i,j,V1,ca=1; while(scanf("%d%d",&N,&V1)&&(N||V1)){ for(i=1;i<=V;i++)
dp[i]=0xfffffff; dp[0]=0; for(i=1;i<=N;i++)
scanf("%d",&c[i]);
for(i=1;i<=N;i++)
scanf("%d",&n[i]); //给钱
for(i=1;i<=N;i++)
MultPack(c[i],1,n[i]); //找零
for(i=1;i<=N;i++)
for(j=V-c[i];j>0;j--)
dp[j]=min(dp[j],dp[j+c[i]]+1);
if(dp[V1]==0xfffffff)
dp[V1]=-1; printf("Case %d: %d\n",ca++,dp[V1]); }; return 0; }
| 10325819 | 2014-03-17 22:30:06 | Accepted | 3591 | 62MS | 308K | 2745 B | C | deron |
其思想就是找零时候做一次01背包,思路跟第二个版本也差不多。
HDU3591找零,背包的更多相关文章
- POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)
Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...
- codevs 3961 硬币找零【完全背包DP/记忆化搜索】
题目描述 Description 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该 ...
- NYOJ995硬币找零(简单dp)
/* 题意:给你不同面额的硬币(每种硬币无限多),需要找零的面值是T,用这些硬币进行找零, 如果T恰好能被找零,输出最少需要的硬币的数目!否则请输出剩下钱数最少的找零方案中的最少硬币数! 思路:转换成 ...
- POJ 3260 The Fewest Coins(多重背包问题, 找零问题, 二次DP)
Q: 既是多重背包, 还是找零问题, 怎么处理? A: 题意理解有误, 店主支付的硬币没有限制, 不占额度, 所以此题不比 1252 难多少 Description Farmer John has g ...
- dp算法之硬币找零问题
题目:硬币找零 题目介绍:现在有面值1.3.5元三种硬币无限个,问组成n元的硬币的最小数目? 分析:现在假设n=10,画出状态分布图: 硬币编号 硬币面值p 1 1 2 3 3 5 编号i/n总数j ...
- NYOJ 995 硬币找零
硬币找零 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从 ...
- usaco 最少找零
Description 约翰在镇上买了 T 元钱的东西,正在研究如何付钱.假设有 N 种钞票,第 i 种钞票的面值为 Vi,约翰身上带着这样的钞票 Ci 张.商店老板罗伯是个土豪,所有种类的钞票都有无 ...
- [LeetCode] Coin Change 硬币找零
You are given coins of different denominations and a total amount of money amount. Write a function ...
- 【ACM小白成长撸】--贪婪法解硬币找零问题
question:假设有一种货币,它有面值为1分.2分.5分和1角的硬币,最少需要多少个硬币来找出K分钱的零钱.按照贪婪法的思想,需要不断地使用面值最大的硬币.如果找零的值小于最大的硬币值,则尝试第二 ...
随机推荐
- Parallels Desktop 7用bootcamp安装win7 后如何激活WIN7
在parallels的选项中,在硬件选项卡的引导标记中添加:kernel.waet.enable=0 ,重新启动win7即可激活.
- PHP 获取时间的各种处理方式!
今天写下php中,如何通过各种方法 获取当前系统时间.时间戳,并备注各种格式的含义,可灵活变通.1.获取当前时间方法date()很简单,这就是获取时间的方法,格式为:date($format, $ti ...
- JavaScript高级程序设计24.pdf
Element类型 Element类型用于表现XML或HTML元素,提供对元素标签名.子节点及特性的访问,它具有以下特征 nodeType的值为1: nodeName的值为元素的标签名: nodeVa ...
- 怎样安装Joomla 1.7网站系统
http://jingyan.baidu.com/article/8065f87fc3de112331249830.html 如果你想使用Joomla(地球上最好的内容管理系统之一)搭建一个网站, ...
- JQ绑定事件(1.9已经废除了live()等绑定事件方法,on()方法是官方推荐的绑定事件的一个方法)
本文来源:http://www.cnblogs.com/leejersey/p/3545372.html jQuery on()方法是官方推荐的绑定事件的一个方法. $(selector).on(ev ...
- 使用.htaccess实现apache URL重定向
一.什么是URL重定向? URL重定向(URL redirection,或称网址重定向或网域名称转址),是指当使用者浏览某个网址时,将他导向到另一个网址的技术. 二.URL重定向怎么配置? 1)首先需 ...
- 开源软件授权协议详解(GPL/MPL/LGPL/BSD/Apache Licence/Creative Commons/MIT)
开源在今天的软件业已经很普遍,但开源是否意味着使用者可以对开源后的代码为所欲为呢? 答案是否定的. 开源运动同样有自己的游戏规则和道德准则. 不遵行这些规则不但损害开源运动的健康发展,也会对违规者造成 ...
- PTA 06-图3 六度空间 (30分)
"六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:"你和任何一个陌生人之间所间隔 ...
- jmeter参数化数据(_csvread函数、用户自定义变量等)
以下是转载内容,仔细看过后,觉得用得最多的应该是csvread函数.用户自定义变量以及CSV DATA CONFIG控制器这几个,但是做练习之后,在结果树和聚合报告中怎么查看执行结果是个问题,没找到对 ...
- [C#] 常用工具类——加密解密类
using System; using System.Configuration; using System.Collections.Generic; using System.Text; using ...