重点还是在状态
推荐使用的状态定义是:d[i][j] 往容量为j的背包里面放前i个物品的最大总重量
求任何的动态规划的题目都可以使用记忆化搜索和递推法
使用递推法必须倒着计算,即每次计算所需要的参数都必须算出来
下面附上我写的代码
#include<cstdio> #include<algorithm> using namespace std; int W[] = {0,30,40,60}; int V[] = {0,50,50,70}; int C = 10; const int maxn = 150; int d[maxn][maxn];//i,j表示将前i个物品放入到体积为j的背包里面的最大重量 //d[i][j] = max(d[i - 1][j], d[i - 1][j - V[i]] + W[i]); //边界为 int main() { for(int j = 0;j <= 100;j++) { if(j < V[1]) d[1][j] = 0; else d[1][j] = W[1]; } for(int i = 2;i <= 3;i++) { for(int j = 0;j <= 100;j++) { d[i][j] =d[i - 1][j]; if(V[i] <= j) d[i][j] = max(d[i][j],d[i - 1][j - V[i]] + W[i]); } } printf("%d\n",d[3][100]); return 0; }
这份代码里面初始化边界和计算分开进行了,紫书上写的是和起来的,值得细细品味
主要就是,先将d[i][j]等于某一个可能值,然后再去max(d[i][j],下一个可能值)
再多的可能也都是这样计算的