您的位置:首页 > 其它

1005-贪心初步

2016-04-05 22:44 344 查看
题意:给出5中币值的钱的数量,让找出一定钱数的最少和最多币值数量的方案的币值数是多少。
题解:发现五种币值是可以约分的,没有互质的,所以简单贪心即可,当时做的时候没有感觉出或者是证明出贪心策略的正确性,所以就想用动态规划背包背,结果就TL,想来用物品的二进制优化应该可以过吧

#include <iostream>
using namespace std;
int w[6] = {1,5,10,50,100},num[5],use[5];
bool dfs(int v,int x){
if (x < 0)
return false;
int n = v / w[x];
if (num[x] >= n){
num[x] -= n;
use[x] += n;
return true;
}
if (dfs(v - num[x]*w[x],x-1)){
use[x] += num[x];
num[x] = 0;
return true;
}
else
return false;
}
int main(){
int n,m;
cin >> n;
while (n--){
cin >> m;
for (int i = 0;i <= 4;i++)
cin >> num[i];
int x = m,ans1 = 0,ans2 = 0;
for (int i = 4;i >= 0;i--){
use[i] = min(num[i],x / w[i]);
ans1 += use[i];
x -= use[i] * w[i];
num[i] -= use[i];
}
if (x){
cout << "-1 -1" << endl;
continue;
}
for (int i = 4;i >= 0;i--){
while (use[i]){
if (dfs(w[i],i-1)){
use[i]--;
num[i]++;
}
else
break;
}
ans2 += use[i];
}
cout << ans1 << ' ' << ans2 << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息