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

本文详细介绍了0-1背包问题,给出动态规划的解决思路,通过最优子结构性质分析问题,并提供了C++和Java两种语言的实现代码,实现了在不超过背包最大重量的情况下,选取物品使得总价值最大,时间复杂度为O(nW)。
摘要由CSDN通过智能技术生成

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Storm-Shadow

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值