动态规划:求解一个问题的最优解,如果这个问题可以不断地分解成子问题并且这个问题的最优解包含子问题的最优解那么久可以用动态规划来解决。把所有子问题的最优解储存下来。
0-1背包:设背包容量大小C,放进去第i件物品,其重量为w,价值v。如果w>C,那么此时最优解为不放进物品i是的最优解,反之,此时最优解为不放进物品i的最优解或者是放入物品i。放入物品i时此时最优解为不放入物品i且背包容量大小为C-w时的最优解再加上物品i。
代码:
#include<iostream>
using namespace std;
int v[200][200];
int max(int a, int b)
{
if(a>b)
return a;
return b;
}
int knap(int i, int W, int*v, int *w ) //决定放不放物品i,背包容量为w
{
if(w[i]>W)
{
return knap(i-1, W, v, w);
}
if(i>0)
{
return max(knap(i-1, W, v, w), knap(i-1, W-w[i-1], v, w)+v[i-1]);
}
else
{
return 0;
}
}
int main()
{
int w[4]={2, 1, 3, 2}; //重量
int v[4]={12, 10, 20, 15}; //价值
int s;
int C=5;
cout << knap(4, 5, v, w);
}