复习笔记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;
}