0-1背包问题,是说给定 n 个物体,每个物体都有一定的重量和价值,再给一个能容纳最大重量为 w 的背包。求从 n 个物体中选出若干个放到背包中,在所选物体总重量不超过 w 的情况下,所选物体的总价值最大。
注意:所有物体都不可分割。
分析:这个问题可抽象为给定两个数组 wt[0..n-1] 和 val[0..n-1],第一个数组表示各物体的重量,第二个数组表示各物体的价值。从 wt 数组中选出若干个元素,它们的总重复不超过 w,而且总价值最大。
这是动态规划里的一个经典问题
1.最优子结构性质
在所有的组合中,对任一给定的物体,它要在么在一个组合里面,要么不在这个组合里面。所以最大价值可这样选择:
1)不包括第 n 个物体,只从剩余的 n-1 个物体中选择;
2)包括第 n 个物体,剩余的重量 W-wt[n-1] 要从剩余的 n-1 个物体中选择。
如果第 n 个物体重量超过 W,那么就只能选第一种情况,由此得到下面的递归程序
#include<stdio.h>
// A utility function that returns maximum of two integers
int max(int a, int b) { return (a > b)? a : b; }
// Returns the maximum value that can be put in a knapsack of capacity W
int knapSack(int W, int wt[], int val[], int n)
{
// Base Case
if (n == 0 || W =&