复习笔记3:动态规划----0/1背包

    对于物体可分割的背包问题,要获得最大的利益,我们可以选择贪心方法;而对于不可分割的问题,我们将使用动态规划的方法来解决。

1.首先回忆一下动态规划的知识:

                  

 

 

2.0/1背包问题(对于有n个物品,容量为M的背包,每个物品或者取或者不取,即xi取0或1;要使放入背包物体的效益和最大!)

极大化 ∑ pixi

约束条件 ∑ wi xi ≤X

xi=0或1, 1≤i≤j

 

最优性原理证明:

      

 

解决方法:0/1背包问题就可表示为KNAP(1,n,M),分为向前处理和向后处理的方法,对应的递推公式如下:

 

 

 

 3.我采用向后处理的方法,用c++实现这个问题的解:

/**

背包的容量:50

物品:10,20,30

效益:60,100,120

**/

#include <iostream>
using namespace std;
int a[4]={0,10,20,30};//物品的重量
int b[4]={0,60,100,120};//物品的效益值
int arr[4][60];//存储总的效益值
int main(int argc, char const *argv[])
{

/**

将矩阵的第一行和第一列初始化为0

**/
for(int i=0;i<60;i++)
{
arr[0][i]=0;
}
for(int i=0;i<4;i++)
{
arr[i][0]=0;
}

 

/**

 两次循环实现递归式的计算

**/

for(int i=1;i<4;i++)
{
for(int j=1;j<51;j++)
{
arr[i][j]=max(arr[i-1][j],arr[i-1][j-a[i]]+b[i]);
}
}

/**

输出最后结果

**/

cout<<arr[3][50];
return 0;
}

posted @ 2016-09-23 17:11  narcissuscyn  阅读(215)  评论(0编辑  收藏  举报