博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
背包问题
阅读量:7179 次
发布时间:2019-06-29

本文共 1260 字,大约阅读时间需要 4 分钟。

1 问题描述

有N个商品,每个商品的体积是c[j], j = 1, 2, 3, .., N,每个商品的价值是v[j], j = 1, 2, ..., N.现在有一个背包,体积是C,现在要求往包里面装商品,使得在装得下的情况下,整包商品的价值最大。

2 问题求解的思路

2.1 子问题提取和描述

v[i, c], 当取的商品是{0, 1, 2, 3, ..., i}的子集,最大体积是c时的最大商品总价值。原问题是,当商品是{1,2,3,...,N}的子集,最大体积是C时的商品的最大总价值,这里缩小了可选择的商品和容量的可选空间,提取子问题,可见这个子问题和原问题是同构的。

2.2 递推关系提取

初始值:

v[0, c] = 0

v[i, c] = -∞, c<0,这个时候方案是不存在的。

递推关系:

分成两类,选择i和不选择i。

不选择i,商品的最大总价值是v[i-1, c];

选择i时,商品的最大总价值是v[i] + v[i-1, c-c[i]]

因此

v[i, c] = max{v[i-1, c], v[i] + v[i-1, c-c[i]]}

2.3 列表求解

例子:c[j] = {3, 5, 2, 7, 4}, v[j] = {2, 4, 1, 6, 5}

v[i, c]    c = 0         1         2         3         4        5        6        7        8        9        10

i = 0          0         0         0         0         0       0         0        0        0        0         0

i = 1           0         0         0         2         2        2        2        2        2        2         2

i = 2          0          0        0         2         2        4        4        4        6        6         6    

i = 3          0          0        1          2         2       4         4        5        6        6         7               

i = 4          0          0        1          2         2       4         4        6        6        7         8

i = 5          0          0        1          2         5       5         6        7        7        9         9

所以,商品的最大价值是9。

3 编程实现

#include <iostream>

int max(int a, int b)
{
    if (a > b)
    {
        return a;
    } else {
        return b;
    }
}
int main(int argc, char* argv[])
{
    int capacity[5] = {3, 5, 2, 7, 4};
    int value[5] = {2, 4, 1, 6, 5};
    int V[6][11] = {0};
    for(int i = 1; i < 6; i++)
    {
        for (int j = 1; j < 11; j++)
        {
            if ((j - capacity[i]) < 0)
            {
                V[i][j] = V[i-1][j];
            } else {
                V[i][j] = max(V[i-1][j], V[i-1][j - capacity[i]] + value[i]);
            }
        }
    }
    std::cout<<"the max is:"<<V[5][10]<<std::endl;

 

转载于:https://www.cnblogs.com/hustdc/p/8034934.html

你可能感兴趣的文章
在字符串S1中删除字符串S2中所包含的字符【转】
查看>>
微软工作这二年
查看>>
二叉搜索树
查看>>
复旦版最佳医院排行 沪21家医院入选全国百佳
查看>>
PHP file_get_contents设置超时处理方法
查看>>
ylbtech-LanguageSamples-XMLdoc
查看>>
27 Best Free Eclipse Plug-ins for Java Developer to be Productive
查看>>
Android应用icon和闪屏splash的尺寸
查看>>
C++强制类型转换操作符 dynamic_cast
查看>>
Image Lazy Load:那些延时加载图片的开源插件(jQuery)
查看>>
VC++ 中ListCtrl经验总结
查看>>
我在tmux中最不可少的配置: 用鼠标切换窗口/调节分屏大小
查看>>
tamper绕WAF详解
查看>>
Static Classes and Static Class Members
查看>>
Linux 索引节点(inode)详解
查看>>
[saiku] 简化/汉化/设置默认页
查看>>
使用nginx搭建https服务器(转)
查看>>
Hibernate注解
查看>>
[转]World Wind Java开发之四——搭建本地WMS服务器
查看>>
3D数学基础:四元数与欧拉角之间的转换
查看>>