結果
| 問題 |
No.158 奇妙なお使い
|
| コンテスト | |
| ユーザー |
hiyokko2
|
| 提出日時 | 2016-08-06 16:44:27 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 1,155 ms / 5,000 ms |
| コード長 | 1,740 bytes |
| コンパイル時間 | 1,234 ms |
| コンパイル使用メモリ | 162,356 KB |
| 実行使用メモリ | 49,176 KB |
| 最終ジャッジ日時 | 2024-06-29 14:13:51 |
| 合計ジャッジ時間 | 3,964 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 27 |
ソースコード
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
//#define int long long
using namespace std;
struct A
{
int A1000, A100, A1;
A(int A1000, int A100, int A1) : A1000(A1000), A100(A100), A1(A1) {}
A() {}
};
A a, b, c;
int Db, Dc;
int dp[11][101][10001];
//preA:元々持っていた各硬貨の枚数
//D:一回のお使いで支払う額
//getB:一回のお使いで得る硬貨の枚数
//返り値:そのお使いをした後の硬貨の枚数のリスト
vector<A> get_next_As(A preA, int D, A getB)
{
vector<A> ret;
for (int a1000 = 0; a1000 <= min(D / 1000, preA.A1000); a1000++)
{
for (int a100 = 0; a100 <= min(D / 100, preA.A100); a100++)
{
int rest = D - 1000 * a1000 - 100 * a100;
if (0 <= rest && rest <= preA.A1)
{
ret.push_back(A(preA.A1000 - a1000 + getB.A1000, preA.A100 - a100 + getB.A100, preA.A1 - rest + getB.A1));
}
}
}
return ret;
}
int rec(A a)
{
if (dp[a.A1000][a.A100][a.A1] != -1)
{
return dp[a.A1000][a.A100][a.A1];
}
int res = 0;
vector<A> next_As1 = get_next_As(a, Db, b);
rep(i,next_As1.size())
{
res = max(res, rec(next_As1[i]) + 1);
}
vector<A> next_As2 = get_next_As(a, Dc, c);
rep(i,next_As2.size())
{
res = max(res, rec(next_As2[i]) + 1);
}
return dp[a.A1000][a.A100][a.A1] = res;
}
signed main()
{
/*
vector<A> ret = get_next_As(
A(5, 20, 1000),
1000,
A(100, 0, 0)
);
rep(i,ret.size())
{
printf("A1000 = %d, A100 = %d, A1 = %d\n", ret[i].A1000, ret[i].A100, ret[i].A1);
}
cout << "aaa" << endl;
*/
cin >> a.A1000 >> a.A100 >> a.A1;
cin >> Db;
cin >> b.A1000 >> b.A100 >> b.A1;
cin >> Dc;
cin >> c.A1000 >> c.A100 >> c.A1;
rep(i,11) rep(j,101) rep(k,10001) dp[i][j][k] = -1;
printf("%d\n", rec(a));
}
hiyokko2