初见完全背包问题。
大致思路是背包专题(第二讲)--完全背包问题_哔哩哔哩_bilibili 详见这个
由于可以从上一次直接拿下来,也可以从这次的前背包中取出,所以考虑
第i-1次为j的情况 第i次为j-w的情况
类似于一个 俩次背包,一次是与上一次的背包,一次是与已经完成序列的背包
#include <bits/stdc++.h>
using namespace std;
int t, m;
int w[1000];
int v[1000];
int dp[10000];
int i, j, k;
int ans = 0;
int main() {
cin >> t >> m;
for (i = 1; i <= m; i++)
cin >> w[i] >> v[i];
for (i = 1; i <= m; i++)
for (j = 1; j <= t; j++) {
if (j >= w[i])
dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
}
for (i = 1; i <= t; i++)
ans = max(ans, dp[i]);
cout << ans;
}