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分钱的零钱.按照贪婪法的思想,需要不断地使用面值最大的硬币.如果找零的值小于最大的硬币值,则尝试第二 ...
随机推荐
- Android学习笔记(十一)BroadcastReceiver动态注册、注销示例
在上一篇博文中简单介绍了一下BroadcastReceiver的相关知识点,本篇举一个在代码中动态的注册.注销BroadcastReceiver的栗子. 1.首先创建一个MyReceiver并继承Br ...
- Linq左右連接
1.左连接: var LeftJoin = from emp in ListOfEmployeesjoin dept in ListOfDepartmenton emp.DeptID equals d ...
- NoSQL数据库的四大分类表格分析
- Jmeter聚合报告分析
Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 Average:平均响应时间--默认情况下是单个 Re ...
- WCF客户端和服务器时间不一致,导致通道建立失败的问题)
本文转载:http://www.cnblogs.com/bcbr/articles/2288374.html 最近,经常有客户反应,前天还用的好好的系统,今天就不能用了. 考虑到系统近来没有做过改动和 ...
- TortoiseSVN客户端重新设置用户名和密码[转]
在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么以后就不用每次都输入一遍用户名密码了. 不过,如果 ...
- [Javascript] IIFE
Javascript modules are a design pattern that allow you to encapsulate your code into smaller self ma ...
- BTrace使用总结
btracejvisualvmhotswap 一.背景 在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数 ...
- VC printf输出彩色字体
在VC下使用SetConsoleTextAttribute()函数可以改变当前控制台的前景色和背景色,从而达到输出彩色字体的效果. 使用的方法也很简单,具体代码如下: #include <win ...
- 隐藏TabBar是个累人的活
最近进行跳转界面隐藏tabbar的时候遇到了一些坑,现在把它记录下来,如果有需要的朋友可以参考一下. 大家一般使用tabbar的时候,隐藏有两种方法. 一种是设置当前所处界面的隐藏属性 self.ta ...