AOJ_2007
硬貨の枚数を少なくしたい。
所持金をすべて払ったときのおつりを求め、そこから重複して払った硬貨の枚数を
引いていけばいい。たぶん一瞬で解が求まるから、8秒の時間制限も余裕。
#include <cstdio> #include <algorithm> using namespace std; int p; //代金 int coin[4]; //各硬貨の枚数 const int coin_g[4] = {10, 50, 100, 500}; int main(){ bool f = false; while(scanf("%d", &p)){ if(p == 0) return 0; if(f) printf("\n"); int sum = 0; //所持金の合計 for(int i = 0; i < 4; i++){ scanf("%d", &coin[i]); sum += coin[i] * coin_g[i]; } int change = sum - p; for(int i = 3; i >= 0; i--){ int t = change / coin_g[i]; //おつりに含まれるcoin_g[i]円硬貨の枚数 coin[i] -= t; //重複している分を引く change -= coin_g[i] * t; } for(int i = 0; i < 4; i++){ if(coin[i] > 0) printf("%d %d\n", coin_g[i], coin[i]); } f = true; } return 0; }