0-1揹包问题(C C++及Java实现)

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 == 0)
       return 0;
 
   // If weight of the nth item is more than Knapsack capacity W, then
   // this item cannot be included in the optimal solution
   if (wt[n-
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章