0-1背包问题的动态规划解法

本文介绍了一个经典的组合优化问题——0-1背包问题,并通过动态规划的方法给出了求解算法。文中还提供了一段C语言实现的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题陈述:
给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。因此,该问题称为0-1背包问题。 

问题的数学抽象:
此问题可转化为:给定c>0,wi>0,vi>0,1≤i≤n,要求找出一个n元0-1向量(x1,x2,…,xn),xi∈{0,1},1≤i≤n,使得∑wixi≤c,而且∑vixi达到最大。因此,0-1背包是一个特殊的整数规划问题:
max ∑vixi
s.t. ∑wixi≤c, xi∈{0,1},1≤i≤n

可用动态规划算法求解。
算法c源码

Code:
  1. #include "stdafx.h"   
  2. #define N 10   
  3. #define W 3   
  4. int mv[N][W]; // mv[i][j]记录0~i件物品中,包重量为j的最大价值。   
  5. int pack( int (&w)[N],int (&v)[N])   
  6. {   
  7.   
  8.     for(int i=0;i<W;++i)  mv[0][i]=0;   
  9.     for(int i=0;i<N;++i)  mv[i][0]=0;   
  10.     int j,i;   
  11.   //动态规划求解   
  12.     for(i=1;i<N;++i)   
  13.     {   
  14.        for(j=1;j<W;++j)   
  15.           if( j >= w[i] )   
  16.           {   
  17.            if( mv[i-1][j]< mv[i-1][j-w[i]]+v[i])   
  18.                 mv[i][j] = mv[i-1][j-w[i]]+v[i];   
  19.             else    
  20.                 mv[i][j] = mv[i-1][j];   
  21.            }   
  22.            else mv[i][j] = mv[i-1][j];   
  23.     }   
  24.     return  mv[N-1][W-1];   
  25. }   
  26. int main()   
  27. {      
  28.     int w[N]={0,2,3,4,5,6,7,8,9,10},v[N]={0,9,2,3,4,5,2,4,5,3};   
  29.     printf("%d",pack(w,v));   
  30.     return 0;   
  31. }  

文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/2008823/137176.html#)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值