hdu 3591 The trouble of Xiaoqian
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的更多相关文章
- HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)
HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...
- HDU - 3591 The trouble of Xiaoqian 题解
题目大意 有 \(N\) 种不同面值的硬币,分别给出每种硬币的面值 \(v_i\) 和数量 \(c_i\).同时,售货员每种硬币数量都是无限的,用来找零. 要买价格为 \(T\) 的商品,求在交易中最 ...
- 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 ...
- The trouble of Xiaoqian
The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu 3591 多重加完全DP
题目: The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- HDUOJ-----3591The trouble of Xiaoqian
The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- hdu3591The trouble of Xiaoqian 多重背包+全然背包
//给出Xiaoqian的钱币的价值和其身上有的每种钱的个数 //商家的每种钱的个数是无穷,xiaoqian一次最多付20000 //问如何付钱交易中钱币的个数最少 //Xiaoqian是多重背包 / ...
- HDU OJ 4334 Trouble 2012 Multi-University Training Contest 4
题目:click here 题意: 给定5组数据,每组数据选择一个数,看是否能找到5个数的和为零. 分析: 千万不要~~T~~ 普通线性查找: #include <iostream> #i ...
随机推荐
- Linux dd——备份命令
Linux学习笔记之备份命令dd 功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换.可以用该命令实现DOS下的diskcopy命令的作用.先用dd命令把软盘上的数据写成硬 ...
- MySQL(7):数值类型
1. 数值类型
- UTF-8编码与Unicode CS2的转换
/* Convert a UTF-8 string into a UCS-2 array. */ void tcstrutftoucs(const char *str, uint16_t *ary, ...
- RecyclerView基本用法
1. 在gradle.build的dependencies中添加RecyclerView需要的包 compile 'com.android.support:cardview-v7:23.4.0'com ...
- 配置LINUX为路由
配置:关闭防火墙 linux1 地址1: 192.168.10.10/24 地址2:192.168.20.10/24(不指定网关,做为路由,自己就是网关) linux2 地址1: 192. ...
- [转]如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误
本文转自:http://www.cnblogs.com/yyangblog/archive/2011/01/07/1929657.html 问题概述: 在导入一个app后提示如下错误: “Error ...
- android 按两次返回键退出应用
private long mExitTime; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCod ...
- MySQL - 启停服务
Windows 环境 命令行方式 启动 MySQL 服务: net start mysql停止 MySQL 服务: net stop mysql 注:需要以管理员身份启动 cmd 后再执行上述命令. ...
- Android屏幕适配-资源文件夹命名与匹配规则
说明:本文档目的为分析android工程res目录下的资源文件夹(drawable,values,layout等)在屏幕适配方面的限定与适配方法. 1. Res下文件夹命名方式 1. 可用的命名属性 ...
- [01] Oracle数据库简介
Oracle关系型数据库:建立在关系模型上. Oracle10g:g(grid)网格技术,网格计算(Grid Computing)通过网络共享,将大量的计算机连接起来,联合各个计算机的多余处理能力,产 ...