0 1 背包问题

核心代码;

定义 dp[i][j] 是从前不i-1个物品中,选出来总重量不超过j的物品时,总价值的最大值

显然 dp[i][j]=0, 因为你没物品可以取的时候,背包的价值为零。 dp[0][j]=0;

 for(int i=0;i<n;i++){

       for(int j=0;j<w;j++){

           if(j<w[i]) dp[i+1][j]=dp[i][j];

           else  dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+p[i]);

}

}

printf("%d\n",dp[n][w]);

代码进行优化:

如下:

int  dp[maxn];

for(int i=0;i<n;i++){

      for(int j=W,j>=w[i];j--){

            dp[j]=max(dp[j],dp[j-w[i]]+p[i])

}

}

代码可以通过不断重复用一个数组来实现。比用二维数组更好。

posted @ 2019-07-31 10:11  zw100  阅读(166)  评论(0编辑  收藏  举报