我正在尝试解决以下SPOJ问题。
输入是:1.硬币中一定数量的钱的总重量,2.使用货币的硬币价值和相应的重量。
目标是找到给定金额的最小可能货币价值。
我的方法是按照它们的价值/重量比按升序排序货币硬币,然后贪心地将第一个硬币的重量适合于总和(跟踪它适合多少次),然后将第二个硬币的重量适合于余数尽可能多次,等等,对于所有硬币或直到余数为零(如果不是,则情况不可能)。
裁判说我的答案是错误的。您能否请提示一下算法有什么问题?
我的代码在此处:
输入是:1.硬币中一定数量的钱的总重量,2.使用货币的硬币价值和相应的重量。
目标是找到给定金额的最小可能货币价值。
我的方法是按照它们的价值/重量比按升序排序货币硬币,然后贪心地将第一个硬币的重量适合于总和(跟踪它适合多少次),然后将第二个硬币的重量适合于余数尽可能多次,等等,对于所有硬币或直到余数为零(如果不是,则情况不可能)。
裁判说我的答案是错误的。您能否请提示一下算法有什么问题?
我的代码在此处:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef unsigned int weight_t;
typedef unsigned int value_t;
struct coin {
weight_t weight;
value_t value;
double value_per_gram;
};
coin make_coin(weight_t weight, value_t value) {
coin ret;
ret.weight = weight;
ret.value = value;
ret.value_per_gram = (double)(value/weight);
return ret;
}
bool compare_by_value_per_gram(const coin& coin1, const coin& coin2) {
return coin1.value_per_gram < coin2.value_per_gram;
}
int main() {
unsigned int test_cases;
cin >> test_cases;
while(test_cases--) {
unsigned int number_of_coins = 0;
weight_t empty_pig, full_pig, coins_weight, coin_weight, min_value = 0;
value_t coin_value = 0;
vector<coin> coins;
vector<unsigned int> how_many_coins;
cin >> empty_pig >> full_pig;
coins_weight = full_pig - empty_pig;
cin >> number_of_coins;
while(number_of_coins--) {
cin >> coin_value >> coin_weight;
coins.push_back(make_coin(coin_weight, coin_value));
}
sort(coins.begin(), coins.end(), compare_by_value_per_gram);
how_many_coins.resize(coins.size());
for(unsigned int i = 0; i < coins.size() && coins_weight > 0; i++) {
how_many_coins[i] = coins_weight/coins[i].weight;
coins_weight %= coins[i].weight;
min_value += coins[i].value * how_many_coins[i];
}
if(coins_weight == 0) cout << "The minimum amount of money in the piggy-bank is " << min_value << "." << endl;
else cout << "This is impossible." << endl;
}
return 0;
}