
分析: 和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;
}

本文详细解析了完全背包问题与01背包的区别,并通过一个具体的代码示例展示了如何使用从前向后的状态转移方式来解决问题,从而使得可以从之前的状态中获取收益。
531

被折叠的 条评论
为什么被折叠?



