Knapsack Problem(0-1背包问题)

0-1背包问题是一个经典的动态规划问题,涉及在有限的背包容量下,选择具有不同重量和价值的物品,以最大化总价值。通过对物品的权衡,采用最优子结构性质,可以构建一个递归程序来解决。为了避免重复计算,可以使用动态规划的 dp 算法,以 O(nW) 时间复杂度找到最佳解。本文提供了 C++ 和 Java 的实现示例。
摘要由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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Storm-Shadow

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

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

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

打赏作者

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

抵扣说明:

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

余额充值