Guest User

Untitled

a guest
Jun 22nd, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.97 KB | None | 0 0
  1. #include <iostream>
  2. #include <tuple>
  3. // #include <algorithm>
  4. using namespace std;
  5. int n;
  6. int w[128];
  7.  
  8. // 500円玉の枚数が最大, 最小の購入
  9. typedef tuple < int, int > Coin;
  10.  
  11. Coin max(Coin a, Coin b){
  12. int a_num, a_value;
  13. int b_num, b_value;
  14. tie (a_num, a_value) = a;
  15. tie (b_num, b_value) = b;
  16.  
  17. if (a_num > b_num) {
  18. return a;
  19. }
  20. if (a_num == b_num) {
  21. if (a_value < b_value) {
  22. return a;
  23. } else {
  24. return b;
  25. }
  26. }
  27. return b;
  28. }
  29.  
  30. Coin dp[128][50005];
  31. // 持ち金(小銭)のコインの種類は関係ない
  32. Coin solve(const int idx, const int coin) {
  33. if (idx == n) return make_tuple(0, 0);
  34. if (dp[idx][coin] != make_tuple(-1, -1)) return dp[idx][coin];
  35. int num, value;
  36. Coin ret = solve(idx + 1, coin); // かわない
  37. int change = 1000 - (w[idx] % 1000); // お釣り整理
  38. change %= 1000; // お釣りが出ないことを忘れていた
  39.  
  40. if (change < 500) { // お釣りが500円未満なら
  41. if (coin + change >= 500) { // 持ち金と足して500円以上にできるなら
  42. tie(num, value) = solve(idx + 1, coin + change - 500);
  43. ret = max(ret, make_tuple(num + 1, value + w[idx]));
  44. } else { // 持ち金じゃ500円を生成できないとき
  45. tie(num, value) = solve(idx + 1, coin + change); // お釣り増やしたほうがいい
  46. ret = max(ret, make_tuple(num, value + w[idx]));
  47. // 買わないは ret の宣言時やってる
  48. }
  49. } else { // お釣りが500円以上の時
  50. tie(num, value) = solve(idx + 1, coin + change - 500); // 遠慮なく差分をいただく
  51. ret = max(ret, make_tuple(num + 1, value + w[idx]));
  52. }
  53. return dp[idx][coin] = ret;
  54. }
  55. int main(int argc, char const *argv[]) {
  56. while (cin >> n && n) {
  57. for (int i = 0; i < 128; ++i)
  58. for (int j = 0; j < 50000; ++j)
  59. dp[i][j] = make_tuple(-1, -1);
  60. for (int i = 0; i < n; ++i) cin >> w[i];
  61. int num, value;
  62. tie(num, value) = solve(0, 0);
  63. cout << num << " " << value << endl;
  64. }
  65. return 0;
  66. }
Add Comment
Please, Sign In to add comment