01-背包问题

原创 2018年04月15日 11:40:27

0-1 背包问题:给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi 。

问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?


分析一波,面对每个物品,我们只有选择拿取或者不拿两种选择,不能选择装入某物品的一部分,也不能装入同一物品多次。


解决办法:声明一个 大小为  m[n][c] 的二维数组,m[ i ][ j ] 表示 在面对第 i 件物品,且背包容量为  j 时所能获得的最大价值 ,那么我们可以很容易分析得出 m[i][j] 的计算方法,

(1). j < w[i] 的情况,这时候背包容量不足以放下第 i 件物品,只能选择不拿

m[ i ][ j ] = m[ i-1 ][ j ]

(2). j>=w[i] 的情况,这时背包容量可以放下第 i 件物品,我们就要考虑拿这件物品是否能获取更大的价值。

如果拿取,m[ i ][ j ]=m[ i-1 ][ j-w[ i ] ] + v[ i ]。 这里的m[ i-1 ][ j-w[ i ] ]指的就是考虑了i-1件物品,背包容量为j-w[i]时的最大价值,也是相当于为第i件物品腾出了w[i]的空间。

如果不拿,m[ i ][ j ] = m[ i-1 ][ j ] , 同(1)

究竟是拿还是不拿,自然是比较这两种情况那种价值最大。



例:0-1背包问题。在使用动态规划算法求解0-1背包问题时,使用二维数组m[i][j]存储背包剩余容量为j,可选物品为i、i+1、……、n时0-1背包问题的最优值。绘制

价值数组v = {8, 10, 6, 3, 7, 2},

重量数组w = {4, 6, 2, 2, 5, 1},

背包容量C = 12时对应的m[i][j]数组。


0123456789101112
1000888888888
20008810101010181818
30668814141616181824
40669914141717191924
50669914141717192124
626891114161719192124

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[1000][1000];
int main()
{
    int m,n;//m 背包容量;待装物品数量;
    int w[100],p[100];
    scanf("%d%d",&m,&n);
    for( int i=1; i<=n; i++)
    {
        scanf("%d%d",&w[i],&p[i]);
    }
    memset(f,0,sizeof(f));
    for( int i=1; i<=n; i++)
    {
        for( int j=1; j<=m; j++)
        {
            if( j>=w[i] )
            {
                f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+p[i]);
                /*if( f[i-1][j]>f[i-1][j-w[i]]+p[i] )
                f[i][j] = f[i-1][j];
                else
                {
                    f[i][j] = f[i-1][j-w[i]]+p[i];
                }*/
            }else
            f[i][j]=f[i-1][j];
        }
    }
    printf("%d\n",f[n][m]);
    return 0;
}:




总结——01背包问题 (动态规划算法)

0-1 背包问题:给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi 。 问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?...
  • xp731574722
  • xp731574722
  • 2017-04-25 20:57:57
  • 23405

HihoCoder第六周:01背包问题

01背包问题大二的时候就接触过了,几行关键代码自己也都看过很多遍了,但是很多代码一直都没能理解。所以今天拿表来好好地画一画,弄懂其中的动态规划究竟什么含义。1038 : 01背包时间限制:20000m...
  • u010885899
  • u010885899
  • 2015-05-07 19:04:38
  • 604

01背包问题详解

首先非常感谢刘汝佳的小白书、HDU刘春英老师的ACM程序设计背包算法课件以及dd_engi的背包九讲和众多大神的博客,看这么多资料最后花了整整一天时间才算大致弄懂了背包问题的思路(=_=搞这么久我确实...
  • qq_33171970
  • qq_33171970
  • 2016-01-25 13:53:03
  • 3540

01背包问题--C语言代码

01背包问题的c语言代码
  • xuqi7
  • xuqi7
  • 2017-05-18 17:43:40
  • 1078

最通俗易懂的01背包问题讲解

1、动态规划(DP)  动态规划(Dynamic Programming,DP)与分治区别在于划分的子问题是有重叠的,解过程中对于重叠的部分只要求解一次,记录下结果,其他子问题直接使用即可,减少了重复...
  • FX677588
  • FX677588
  • 2017-04-02 14:02:51
  • 10941

01-背包问题---Bone Collector

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • u013599426
  • u013599426
  • 2015-04-10 13:34:41
  • 264

hdu2546 饭卡 01-背包问题

01-背包问题
  • u012860063
  • u012860063
  • 2014-06-21 16:02:20
  • 961

背包问题-背包01-苹果

package 动态规划.背包01; import java.util.Scanner; public class 苹果 { static class Apple { public i...
  • Nuan_Feng
  • Nuan_Feng
  • 2017-02-23 13:14:53
  • 77

背包问题-背包01-大数据

package 动态规划.背包01; import java.util.Arrays; import java.util.Scanner; /*  * 重量w,放满N个物品保证价值最大...
  • Nuan_Feng
  • Nuan_Feng
  • 2017-02-23 13:14:09
  • 196

PTA 数据结构 01-复杂度2 Maximum Subsequence Sum (25分)

第七个测试点始终过不去,但是根据网上找到的答案找出了原因:若 INPUT: —10 —-2 -2 0 1 2 3 4 5 6 7 OUPUT: 28 2 7 ——-我的代码(在PAT...
  • qq_32588507
  • qq_32588507
  • 2016-05-27 07:50:59
  • 272
收藏助手
不良信息举报
您举报文章:01-背包问题
举报原因:
原因补充:

(最多只允许输入30个字)