Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币.
标签:input style content out 次方 iostream ace 优化 组成
Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币.
第一行一个数 n, 1 <= n <= 200. 接下来一行 n 个整数b1, b2,..., bn, 1 <= b1 < b2 < ... < b n <= 20 000, 第三行 n 个整数c1, c2,..., cn, 1 <= ci <= 20 000, 表示每种硬币的个数.最后一行一个数k – 表示要凑的面值数量, 1 <= k <= 20 000.
第一行一个数表示最少需要付的硬币数
#include<iostream> #include<cstdio> int num,n,k,now,t,b[40000],x[40000],y[40000],a[4000005],f[4000005]; using namespace std; int min(int x,int y) { if (x>y) return y; return x; } int main() { cin>>n; num=0; for (int i=1;i<=n;i++) cin>>a[i]; for (int i=1;i<=n;i++) { cin>>b[i];//输入这种硬币的数量 t=1;//枚举2的几次幂 while (t*2-1<b[i])//如果目前为止枚举的所有2的幂的和小于总硬币数的话 { num+=1;//数组长度 x[num]=t*a[i];//我们就把枚举的t件物品变成一件,x储存t件原物品即现在这件物品的价值 y[num]=t;//这件物品所代表的硬币数量 t=t*2;//去枚举另外一个2的幂 } num+=1; y[num]=b[i]-(t-1);//剩下还有几个硬币也算作一件,如举例中3这个数。 x[num]=y[num]*a[i];//剩下这件物品的价值 } cin>>k; //for (int i=1;i<=num;i++) cout<<x[i]<<‘ ‘<<y[i]<<endl; for (int i=0;i<=k;i++) f[i]=1000000005; f[0]=0; for (int i=1;i<=num;i++) for (int j=k;j>=x[i];j--)//注意倒写 f[j]=min(f[j-x[i]]+y[i],f[j]);//最好动态数组降维 cout<<f[k]<<endl; return 0; }
恩,写完了。
1531: [POI2005]Bank notes二进制优化(c++)
标签:input style content out 次方 iostream ace 优化 组成
原文地址:http://www.cnblogs.com/2014nhc/p/6209503.html