完全背包问题
二维:dp[i][j]=max(dp[i-1][j],dp[i][j-a[i].t]+a[i].value);//只考虑当前层的状态,所以第二层循环是正序。
一维:dp[j]=max(dp[j],dp[j-a[i].t]+a[i].value);
#include<iostream> #include<algorithm> #include<vector> #include<queue> using namespace std; typedef long long int ll; struct node{ int t,value; }a[1000005]; vector<ll >dp(1000005); int main() { int n,k;cin >> k>>n; for (int i = 0;i < n;i++){ cin >> a[i].t>>a[i].value; } dp.clear(); for (int i = 0;i < n;i++) { for (int j = a[i].t;j <= k;j++) { dp[j] = max(dp[j], dp[j - a[i].t]+a[i].value); } } cout << dp[k]<<endl; return 0; } /* 6 3 34 4 12 5 2 9 */