HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)
HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)
pid=3591">http://acm.hdu.edu.cn/showproblem.php? pid=3591
题意:
有一个具有n种货币的货币系统, 每种货币的面值为val[i]. 如今小杰手上拿着num[1],num[2],…num[n]个第1种,第2种…第n种货币去买价值为T(T<=20000)的商品, 他给售货员总价值>=T的货币,然后售货员(可能,假设小杰给的钱>T,那肯定找钱)找钱给他.
售货员每次总是用最少的硬币去找钱给小杰. 如今的问题是: 小杰买价值T的商品时, 他给售货员的硬币数目+售货员找他的硬币数目最少等于多少?
分析:
我们令dp1[j]==x表示小杰给售货员价值j的硬币时, 须要最少x个硬币. 我们令dp2[j]==x表示售货员给小杰价值j的硬币时, 须要最少x个硬币.
那么前一个问题就是一个多重背包问题(由于小杰的硬币有限度), 而第2个问题是全然背包问题(售货员硬币无限).
终于我们所求为: min( dp1[T+i]+dp2[i]) 当中 i属于[0,20000-T].
对于第一个多重背包问题:
我们令dp1[i][j]==x表示用前i种硬币构成j金钱时, 最少须要x个硬币.
初始化: dp1全为INF且dp1[0][0]=0.
对于第i种硬币, 我们要分情况处理:
假设val[i]*num[i]>=20000, 那么就做一次全然背包.
假设val[i]*num[i]<20000, 那么就把该物品看出新的k+1种物品,然后做k+1次01背包.
终于我们所求为dp1[n][j]这维数组就是我们之前说的dp1[j].
对于第二个全然背包问题:
我们令dp2[i][j]==x表示用前i种硬币构成j金钱时, 最少须要x个硬币.
初始化: dp2全为INF 且dp2[0][0]=0.
状态转移: dp2[i][j] = min( dp2[i-1][j] , dp2[i][j-val[i]]+1 ) //sum是求和
前者表示第i种货币一个都不用, 后者表示第i种货币至少用1个.
终于所求: dp2[n][j]这维数组是我们上面所求的dp2[j].
终于让i从T+1到20000遍历一边, 找出min( dp1[T] , dp1[i]+dp2[i-T] )的值.
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 1e8
const int maxn=100+5; int n;//n种货币
int T;//商品金额
int val[maxn];//每种货币面值
int num[maxn];//每种货币数目
int dp1[20000+5];
int dp2[20000+5]; //1次01背包过程
void ZERO_ONE_PACK(int *dp,int cost,int sum)
{
for(int i=20000;i>=cost;i--)
dp[i] = min(dp[i],dp[i-cost]+sum);//注意这里是+sum,而不是+1
} //1次全然背包过程
void COMPLETE_PACK(int *dp,int cost)
{
for(int i=cost;i<=20000;i++)
dp[i] = min(dp[i],dp[i-cost]+1);
} //1次多重背包过程
void MULTIPLY_PACK(int *dp,int cost,int sum)
{
if(cost*sum>=20000)
{
COMPLETE_PACK(dp,cost);
return ;
} int k=1;
while(k<sum)
{
ZERO_ONE_PACK(dp,cost*k,k);
sum-=k;
k*=2;
}
ZERO_ONE_PACK(dp,cost*sum,sum);
} int main()
{
int kase=0;
while(scanf("%d%d",&n,&T)==2)
{
//注意退出,否则WA
if(n==0 && T==0) break; //读取输入
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]); //初始化
for(int i=0;i<=20000;i++)
dp1[i]=dp2[i]=INF;
dp1[0]=dp2[0]=0; //递推
for(int i=1;i<=n;i++)
MULTIPLY_PACK(dp1,val[i],num[i]);
for(int i=1;i<=n;i++)
COMPLETE_PACK(dp2,val[i]); //输出结果
int ans=dp1[T];
for(int i=T+1;i<=20000;i++)
ans=min(ans, dp1[i]+dp2[i-T]); printf("Case %d: %d\n",++kase,ans==INF?-1:ans);
}
return 0;
}
HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)的更多相关文章
- hdu 3591 The trouble of Xiaoqian
hdu 3591 The trouble of Xiaoqian 题意:xiaoqi要买一个T元的东西,当前的货币有N种,xiaoqi对于每种货币有Ci个:题中定义了最小数量即xiaoqi拿去买东西 ...
- HDU - 3591 The trouble of Xiaoqian 题解
题目大意 有 \(N\) 种不同面值的硬币,分别给出每种硬币的面值 \(v_i\) 和数量 \(c_i\).同时,售货员每种硬币数量都是无限的,用来找零. 要买价格为 \(T\) 的商品,求在交易中最 ...
- POJ 3260 The Fewest Coins(多重背包+全然背包)
POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...
- hdu3591The trouble of Xiaoqian 多重背包+全然背包
//给出Xiaoqian的钱币的价值和其身上有的每种钱的个数 //商家的每种钱的个数是无穷,xiaoqian一次最多付20000 //问如何付钱交易中钱币的个数最少 //Xiaoqian是多重背包 / ...
- HDU 3594 The trouble of Xiaoqian 混合背包问题
The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- HDU 3591 (完全背包+二进制优化的多重背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3591 The trouble of Xiaoqian Time Limit: 2000/1000 M ...
- B 维背包+完全背包 Hdu2159
<span style="color:#3333ff;">/* ---------------------------------------------------- ...
- HDU 3591 多重背包
给出N种钱币和M 给出N种钱币的面值和个数 NPC拿着这N些钱币去买价值M的物品,能够多付.然后被找零,找零的钱也为这些面值.但没有数量限制 问最少经手的钱币数量 对于NPC做一个付款多重背包 然后对 ...
- hdu 3591 多重加完全DP
题目: The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
随机推荐
- MFC之HTTP文件上传
BOOL UploadFile(LPCTSTR strURL, LPCTSTR strLocalFileName) { // 如果URL为空或者文件不存在,直接返回 if (strURL == NUL ...
- 软工实践第八次作业——UML设计
本次作业博客 团队组成 临时组长:何裕捷 组员:蔡子阳,陈德斌,胡青元,李麒,高裕翔,王焕仁,黄培鑫 UML 用例图 描述的部分: 1 这里是用户个人管理系统的用例图 面临的问题: 1 面临用户登录注 ...
- SOCK5代理服务器
SOCK5代理服务器 简单介绍下比较好用的代理服务器,在部署过程中在内外网访问,需要切网比较麻烦,所以可以在互联网区部署sock5代理,通过配置代理切换服务器, 比较方便配置,节省时间. 官网: ht ...
- hihoCoder 1133 二分·二分查找之k小数(TOP K算法)
#1133 : 二分·二分查找之k小数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很 ...
- git 使用报错记录
错误一:git fatal: unable to write new index file主要原因就是服务器磁盘空间不够导致的,增加服务器空间就OK了在百度上面搜索没得到什么有效信息,在gooogle ...
- HTML+CSS之iframe
碎碎:这两天在实践中,用到了 iframe,之前对其不甚了解,了解之中遇到好多奇葩问题,今天记录下这两天遇到的相关的内容. 嵌入的 iframe 页面的边框 嵌入的 iframe 页面的背景 嵌入的 ...
- 解决 unity 用 vs通过wifi 真机联调 一直连接不上
平时 在公司网络太差,要通过wifi 用vs真机联调时,vs一直连不上设备,很是蛋疼...用下面官方给出的方法可以解决 Attaching MonoDevelop Debugger To An And ...
- pat 甲级 1038. Recover the Smallest Number (30)
1038. Recover the Smallest Number (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...
- Python 使用cx_freeze 生成exe文件【转】
Python 使用cx_freeze 生成exe文件 在python中比较常用的python转exe方法有三种,分别是cx_freeze,py2exe,PyInstaller.py2exe恐怕是三 ...
- 洛谷P1279 字串距离
题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...