分析: 和01背包的不同之处就在于第二个循环,01背包是从后向前推,无法从后面的状态中获得收益,但是完全背包可以选很多个,就可以从前向后推,进而从之前的状态中获取收益,状态转移方程dp[i] = max{dp[i], dp[i-w[i]] + v[i]},这一题的w是时间t
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 100000+10;
int N, W, dp[maxn], t1, t2;
int main() {
cin >> W >> N;
for(int i = 1; i <= N; i++) {
cin >> t1 >> t2;
for(int j = t1; j <= W; j++) {
dp[j] = max(dp[j], dp[j-t1]+t2);
}
}
cout << dp[W];
return 0;
}