相信大家都学过01背包、完全背包吧....
可惜....在这里是多重背包!!!!!
/***
首先我们分类一下qwq
这是一个多重背包问题qwq
求最少硬币个数,所以得用min,不是max哦~
上代码!!!(废话)
***/
#include<bits/stdc++.h>
using namespace std;
int t,m,a,b,c;
int q[4],s[4];
int f[105];
//j表示背包容量
int main(){
cin>>t;//有几组数据呢???
q[1]=10;q[2]=5;q[3]=1;//分别代表10元,5元,1元$$$$$$钱好多呀\(^o^)/~
while(t--){
cin>>m>>s[3]>>s[2]>>s[1];//输入巧克力价格、钱币持有数量
for(int i=1;i<=m;i++) {
f[i]=101;//默认101
}
for(int i=1;i<=3;i++){//循环....没什么好稀奇的
for(int j=m;j>=0;j--)//循环....没什么好稀奇的
for(int k=0;k<=s[i]&&k*q[i]<=j;k++)//循环....没什么好稀奇的
f[j]=min(f[j],f[j-k*q[i]]+k);//啊!这是最小!应该没有掉进坑:D
}
if(f[m]==101) cout<<"-1"<<endl;//若f[m]为初始值....那就别买了:)
else cout<<f[m]<<endl;
}
return 0;
}
京公网安备 11010502036488号