dp[i][j],i表示物品,j表示总时间,也可以理解为背包的最大容量。
那么就有两种情况了,就是选和不选。
选就是dp[i - 1][j - t[i]] + v[i],不选就是dp[i - 1][j]。就是01背包问题
- #include
- using namespace std;
- using ll = long long;
- ll T, M;
- ll dp[105][1010];
- ll t[105], v[105];
-
- void solve()
- {
- for (int i = 1; i <= M; ++i)cin >> t[i] >> v[i];
- for (int i = 1; i <= M; ++i)
- {
- for (int j = 0; j <= T; ++j)//从前往后还是从后往前都没有影响
- {
- if (j >= t[i])dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - t[i]] + v[i]);
- else dp[i][j] = dp[i - 1][j];//时间不够就不需要减掉花费的时间
- }
- }
- cout << dp[M][T] << '\n';
- }
-
- int main()
- {
- ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
- while (cin >> T >> M)
- {
- if (T == 0 && M == 0) break;
- solve();
- }
- return 0;
- }