hdu 3591  The trouble of Xiaoqian

题意:xiaoqi要买一个T元的东西,当前的货币有N种,xiaoqi对于每种货币有Ci个;题中定义了最小数量即xiaoqi拿去买东西的钱的张数加上店家找的零钱的张数(店家每种货币有无限多张,且找零是按照最小的数量找零的);问xiaoqi买元东西的最小数量?

多重背包+完全背包;

思路:这个最小数量是拿去买东西的张数和找零的张数之和,其实我们只需要将这两个步骤分开,开算出能买T元东西的前i最少f[i]张,这里涉及到容量问题;容量只要大于T小于最大的上线20,000即可;之后使用贪心将货币排序加上找的零钱的数量,求出最小的数量即可;

注:无解的情况分为 总的和达不到T,和当前的货币不能找开i;(i - T找零时除到了0...RE了几次);

78MS  1668K

#include<bits/stdc++.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1
typedef __int64 ll;
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
const int M = ;
int f[M],V,n;
int w[],num[];
void ZeroOnePack(int w,int k)
{
for(int v = V;v >= w;v--)
f[v] = min(f[v],f[v-w]+k);
}
void CompletePack(int w)
{
for(int v = w;v <= V;v++)
f[v] = min(f[v],f[v-w]+);
}
void MultiPack(int w,int num)
{
if(w*num >= V)
CompletePack(w);
else{
for(int k = ;k < num;k <<= ){
ZeroOnePack(w*k,k);
num -= k;
}
ZeroOnePack(w*num,num);
}
}
inline int change(int a)
{
int cnt = ;
for(int i = n;a;i--){
if(w[i] == ) return inf;
cnt += a/w[i];
a %= w[i];
}
return cnt;
}
int main()
{
int t,kase = ;
while(scanf("%d%d",&n,&t) == && n+t){
int sum = ;
rep1(i,,n) read1(w[i]);
rep1(i,,n) read1(num[i]),sum += num[i]*w[i];
V = min(sum,M-);
memset(f,0x3f,sizeof(f));
f[] = ;
rep1(i,,n)
MultiPack(w[i],num[i]);
sort(w+,w+n+);
//rep_1(i,n,1) cout<<w[i]<<" ";puts("");
int ans = inf;
rep1(i,t,V)if(f[i] != inf){
f[i] += change(i-t);
ans = min(ans,f[i]);
}
printf("Case %d: %d\n",kase++,ans == inf?-:ans);
}
return ;
}

hdu 3591 The trouble of Xiaoqian的更多相关文章

  1. HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)

    HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...

  2. HDU - 3591 The trouble of Xiaoqian 题解

    题目大意 有 \(N\) 种不同面值的硬币,分别给出每种硬币的面值 \(v_i\) 和数量 \(c_i\).同时,售货员每种硬币数量都是无限的,用来找零. 要买价格为 \(T\) 的商品,求在交易中最 ...

  3. HDU 3594 The trouble of Xiaoqian 混合背包问题

    The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  4. HDU 3591 (完全背包+二进制优化的多重背包)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3591 The trouble of Xiaoqian Time Limit: 2000/1000 M ...

  5. The trouble of Xiaoqian

    The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...

  6. hdu 3591 多重加完全DP

    题目: The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  7. HDUOJ-----3591The trouble of Xiaoqian

    The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  8. hdu3591The trouble of Xiaoqian 多重背包+全然背包

    //给出Xiaoqian的钱币的价值和其身上有的每种钱的个数 //商家的每种钱的个数是无穷,xiaoqian一次最多付20000 //问如何付钱交易中钱币的个数最少 //Xiaoqian是多重背包 / ...

  9. HDU OJ 4334 Trouble 2012 Multi-University Training Contest 4

    题目:click here 题意: 给定5组数据,每组数据选择一个数,看是否能找到5个数的和为零. 分析: 千万不要~~T~~ 普通线性查找: #include <iostream> #i ...

随机推荐

  1. Models and the ServiceManager

    Models and the ServiceManager In the previous chapter we've learned how to create a "Hello Worl ...

  2. Android学习之Activity初步

    Activity作为Android的第一步接触的概念,在学习中将初步的认识总结下来,以便后续的回顾与反思. 1.在用Android Studio生成第一个helloworld应用程序运行在手机上时,发 ...

  3. 在IOS中 NSRange类详解

    NSRange的定义 typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; NSRange是一个结构 ...

  4. Xcode常用快捷键总结

    Xcode常用快捷键 Xcode窗口快捷键 其他补充: 编译代码: command + B 将代码翻译为计算机能够识别的语言(0/1) 调试Xcode中程序: command + R 折叠与展开方法代 ...

  5. lambda expand in list

    [(lambda x: x*x)(x) for x in range(10)] Or better yet: [x*x for x in range(10)]

  6. Elasticsearch 搜索不到数据问题(_mapping 设置)

    需求 由于 kibana3 中,不支持直接在请求的 url 中设置搜索的 type (是不是我不知道???). 为了支持特定 type 的搜索,所以我设置了个下每个 panel 的查询语句,让它增加一 ...

  7. [转]win7 64位下android开发环境的搭建

    本文转自:http://www.cfanz.cn/index.php?c=article&a=read&id=65289 最近换了新电脑,装了win7 64位系统,安装了各种开发环境, ...

  8. Ubuntu 修改时间

    输入"date",显示的是: Tue Jan :: UTC 输入"date -R" 显示的是: Tue, Jan :: + 和北京时间相差了8个小时. 1.选择 ...

  9. 【转】web测试方法总结

      一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~!@#¥%……&*?[]{}”特别要注意单引号和&符号.禁止直接输入特殊字符时 ...

  10. N_F1_APPROVE

    package nc.bs.pub.action; import java.util.ArrayList; import java.util.Hashtable; import java.util.L ...