题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3591

The trouble of Xiaoqian

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2798    Accepted Submission(s): 972

Problem Description
In the country of ALPC , Xiaoqian is a very famous mathematician. She is immersed in calculate, and she want to use the minimum number of coins in every shopping. (The numbers of the shopping include the coins she gave the store and the store backed to her.)
And now , Xiaoqian wants to buy T (1 ≤ T ≤ 10,000) cents of supplies. The currency system has N (1 ≤ N ≤ 100) different coins, with values V1, V2, ..., VN (1 ≤ Vi ≤ 120). Xiaoqian is carrying C1 coins of value V1, C2 coins of value V2, ...., and CN coins of value VN (0 ≤ Ci ≤ 10,000). The shopkeeper has an unlimited supply of all the coins, and always makes change in the most efficient manner .But Xiaoqian is a low-pitched girl , she wouldn’t like giving out more than 20000 once.
 
Input
There are several test cases in the input.
Line 1: Two space-separated integers: N and T.
Line 2: N space-separated integers, respectively V1, V2, ..., VN coins (V1, ...VN)
Line 3: N space-separated integers, respectively C1, C2, ..., CN
The end of the input is a double 0.
 
Output
Output one line for each test case like this ”Case X: Y” : X presents the Xth test case and Y presents the minimum number of coins . If it is impossible to pay and receive exact change, output -1.
 
Sample Input
3 70
5 25 50
5 2 1
0 0
 
Sample Output
Case 1: 3
 
Author
alpc97
 分析:
第一次做两种背包结合在一起的问题
写了差不多3小时,到处看看大佬的解题思路,终于弄懂了
题意:
 
有一个具有n种货币的货币系统, 每种货币的面值为val[i]. 现在小杰手上拿着num[1],num[2],…num[n]个第1种,第2种…第n种货币去买价值为T(T<=20000)的商品, 他给售货员总价值>=T的货币,然后售货员(可能,如果小杰给的钱>T,那肯定找钱)找钱给他. 售货员每次总是用最少的硬币去找钱给小杰. 现在的问题是: 小杰买价值T的商品时, 他给售货员的硬币数目+售货员找他的硬币数目最少等于多少?
 
第一行先输入n和c,n代表硬币的种类数,c代表顾客需要付的款数,
第二行是顾客n种硬币的面值
第三行是顾客相应的n种硬币的个数
 
顾客和店员的区别:
具有的硬币的种类数都是n种,不过顾客的硬币数是有限的(输入的相应硬币数目),店员的硬币数目是无限的
 
现在顾客需要买c元的东西,只能用这些硬币付款,且顾客手中不同种类的硬币的数目是有限的,所以现在顾客付款有两种情况:
1.店员不需要找钱 顾客手中的硬币种类和个数刚好可以组成c元
2.店员需要找钱,顾客手中硬币种类和个数不可以恰好组成c元,所以顾客只能给T元,店员给顾客找钱c-T元
现在要 求经过店员和顾客手中的硬币的最小数目
 
解题思路;
主要的方向就是对店员进行完全背包从操作,对顾客进行多重背包的操作,然后最后遍历两个dp数组,找到最小硬币数目(t=min(t,dp2[i]+dp1[i-c]))
很多需要注意的地方:
1.dp数组初始化
因为是要能付款,而不是求硬币数目最少,所以是"恰恰好装满背包“
所以两个数组除了dp[0]以外,都要赋无穷大
2.多重背包要采用二进制优化,不然会超时
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define max_v 20010
#define INF 0x3f3f3f3f
int w[max_v],num[max_v];
int dp1[max_v],dp2[max_v];
int main()
{
int n,c,yy=;
while(~scanf("%d %d",&n,&c))
{
if(n==&&c==)
break;
for(int i=;i<n;i++)
{
scanf("%d",&w[i]);
}
int sum=;
for(int i=;i<n;i++)
{
scanf("%d",&num[i]);
sum=sum+num[i];
}
//初始化
for(int i=;i<max_v;i++)
{
dp1[i]=dp2[i]=INF;//无穷max
}
dp1[]=;
dp2[]=;
//对店员完全背包
for(int i=;i<n;i++)
{
for(int j=w[i];j<=;j++)
{
dp1[j]=min(dp1[j],dp1[j-w[i]]+);
}
}
//对顾客多重背包 二进制优化
for(int i = ;i < n;i++)
{
for(int k = ;k <= num[i];k*=)
{
for(int j = max_v - ;j >= k*w[i];j--)
dp2[j] = min(dp2[j] , dp2[j-k*w[i]] + k) ;
num[i]-=k;
}
for(int j = max_v;j >= num[i]*w[i];j--)
dp2[j] = min(dp2[j] , dp2[j - num[i]*w[i]] + num[i]) ;
} int t=INF;
for(int i=c;i<=;i++)
{
t=min(t,dp2[i]+dp1[i-c]);
}
if(t==INF)
{
t=-;
}
printf("Case %d: %d\n",yy,t);
yy++;
}
return ;
}

HDU 3591 (完全背包+二进制优化的多重背包)的更多相关文章

  1. HDU 2844 二进制优化的多重背包

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

  3. HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)

    HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...

  4. HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)

    HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化) 题意分析 首先C表示测试数据的组数,然后给出经费的金额和大米的种类.接着是每袋大米的 ...

  5. hdu1059 多重背包(转换为01背包二进制优化)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1059 之前写过一个多重背包二进制优化的博客,不懂请参考:http://www.cnblog ...

  6. hdu1059 dp(多重背包二进制优化)

    hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听 ...

  7. D - D 分糖果HDU - 1059(完全背包+二进制优化)

    有两个小朋友想要平分一大堆糖果,但他们不知道如何平分需要你的帮助,由于没有spj我们只需回答能否平分即可. 糖果大小有6种分别是1.2.3.4.5.6,每种若干颗,现在需要知道能不能将这些糖果分成等额 ...

  8. hdu 2191 珍惜现在,感恩生活 多重背包入门题

    背包九讲下载CSDN 背包九讲内容 多重背包: hdu 2191 珍惜现在,感恩生活 多重背包入门题 使用将多重背包转化为完全背包与01背包求解: 对于w*num>= V这时就是完全背包,完全背 ...

  9. HDU 5445 Food Problem(多重背包+二进制优化)

    http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:现在你要为运动会提供食物,总共需要提供P能量的食物,现在有n种食物,每种食物能提供 t 能量,体积为 ...

随机推荐

  1. spring-boot-starter-actuator不起作用

    spring-boot-starter-actuator的作用,actuator是监控系统健康情况的工具.使用这个功能首先要先添加依赖,如下.<!-- 监控和管理生产环境--><de ...

  2. drupal7图片样式无法生成与显示

    正常设置了图像的样式,并且为内同类型正确设置了显示的样式.但是上传图片后,却并没有在对应的文件夹下生成对应的缩略图.自然没有显示. 网上查询了一下,需要为nginx添加两个设置: location @ ...

  3. opencv3.2.0形态学滤波之开运算、闭运算

    /* 一.开运算: (1)开运算,其实就是先腐蚀后膨胀的过程. (2)数学表达式:dst = open(src,element) = dilate(erode(src,element)) (3)作用: ...

  4. 今年新鲜出炉的30个流行Android库,你一定需要

    作者|Michal Bialas 2017年快过去了,你年初的定的目标都快完成了吗?总结过去三个月内发布的 最新的30 个 Android 库和项目.你一定需要,建议收藏!让你事半功倍 1.Mater ...

  5. Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...

  6. Android:Building " " Gradle project info 问题

    Android Studio新建或者打开项目的时候,一直卡在Building "" Gradle project info 进度上不动,猜测是网络原因下载gradle不成功. 两种 ...

  7. Fragment 源码解析add()和replace()方法

    1.有问题的代码: MainActivity public class MainActivity extends AppCompatActivity implements View.OnClickLi ...

  8. idea springboot应用启动

    在idea里启动springboot应用最好使用 spring-boot:run 如果通过运行main方法启动应用,会找不到页面

  9. Oracle EBS 获取完全的值集信息

    SELECT fvs1.flex_value_set_name, fvs1.description, decode(upper(fvs1.longlist_flag), 'N', '值列表', 'Y' ...

  10. EF的连表查询Lambda表达式和linq语句

    select c; ), b=> b.Id, p=> p.BlogId, (b, p) => new {b}); public class Blog { public int Id ...