第一道背包问题,0-1背包,参考网上一位大牛写的做的。状态方程:dp[i][w] = max{dp[i-1][w], dp[i-1][w-obj[i].wei] + obj[i].val]},但这样会超内存,需要一个空间复杂度的优化将dp改为一维,这招看来以后得常用,具体见转载的《背包九讲》。
明天好好读读《背包九讲》,在多做几道dp变形题,练习在于精不在多。
#include <iostream> using namespace std; const int mMax = 3500;//待选物品个数 const int nMax = 14000;//最大容量 struct{ int wei,val; }node[mMax]; int main(){ int n,m,i,w,dp[nMax]; cin>>n>>m;//n为物品个数,m为最大容量 for (i = 1;i <= n;i++) cin>>node[i].wei>>node[i].val; memset(dp,0,(m+1) * sizeof(int)); for (i = 1;i <= n;i++) for (w = m;w >= node[i].wei;w--)//从后向前dp,前面的数会影响后面的 if (dp[w] < dp[w - node[i].wei] + node[i].val) dp[w] = dp[w - node[i].wei] + node[i].val; cout << dp[m]<<endl; return 0; }