版权声明:转载请注明出处。 https://blog.csdn.net/TungstenC/article/details/83142865
题目描述
Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有
种面值的硬币,面值分别为
。但是每种硬币有数量限制,现在我们想要凑出面值
求最少要用多少个硬币。
,
,
,
。
算法分析
多重背包裸题,使用二进制优化,输出方案和单调队列优化待填坑。
代码实现
#include <cstdio>
#include <cstring>
#include <algorithm>
const int maxn=205;
const int maxk=20005;
int b[maxn],c[maxn],f[maxk];
int main() {
int n;scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&b[i]);
for(int i=1;i<=n;++i) scanf("%d",&c[i]);
int K;scanf("%d",&K);
memset(f,0x3f,sizeof(f));f[0]=0;
for(int i=1;i<=n;++i) {
for(int j=1;j<=c[i];j<<=1) {
for(int k=K;k>=b[i]*j;--k) f[k]=std::min(f[k],f[k-b[i]*j]+j);
c[i]-=j;
}
if(c[i]) for(int k=K;k>=b[i]*c[i];--k) f[k]=std::min(f[k],f[k-b[i]*c[i]]+c[i]);
}
printf("%d\n",f[K]);
return 0;
}