背包算法最优解的问题

问题描述

背包算法最优解的问题

若果把背包问题 直接按价值降序排列 和 按单位质量价值降序排列 两者的结果进行比较,能不能得出最优解?如果不能,在不涉及递归和穷举的前提下,有什么方法可以得出最优解?

解决方案

选取价值最大者。反例:
W=30
物品:A B C
重量:28 12 12
价值:30 20 20
根据策略,首先选取物品A,接下来就无法再选取了,可是,选取B、C则更好。
选取单位重量价值最大的物品。反例:
W=30
物品:A B C
重量:28 20 10
价值:28 20 10
根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断.

使用动态规划来处理背包问题:
背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }
f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值。

参考代码:

 #include <iostream>
#include <vector>
using namespace std;
//物品类
class packitem{
    public:
        packitem(int w, int v):weight(w), value(v){}
        int weight;
        int value;
};
int matrix[5][10] = {0};
int maxValue(int matrix[][10], vector<packitem*> vecpack, int bagsize, int bagweight){
    for(int i = bagsize - 1; i >= 0; --i){
        for(int j = 0; j < bagweight; ++j){
            packitem item = *vecpack[i];
            if(item.weight > j + 1){
                //当前背包不能装下此物品
                if(0 == j){
                    matrix[i][j] = 0;
                }
                else{
                    matrix[i][j] = matrix[i + 1][j];
                }
            }
            else{
                int valueInbag = 0;
                if( i == bagsize - 1|| j - item.weight + 1 < 0){
                    matrix[i][j] = item.value;
                    continue;
                }
                else{
                    int tmp = 0;
                    if (j - item.weight >= 0)
                        tmp = j - item.weight;
                    valueInbag = matrix[i + 1][tmp] + item.value;
                    matrix[i][j] = max(matrix[i + 1][j], valueInbag);
                }
            }
        }
    }

    for(int i = 0; i < bagsize; ++i){
        for(int j = 0; j < bagweight; ++j){
            cout<<matrix[i][j]<<" ";
        }
        cout<<endl;
    }
    return matrix[0][bagweight - 1];

}
int main()
{
    vector<packitem*> tmp;
    int w[] = {2,2,6,5,4};
    int v[] = {6,3,5,4,6};
    int bagweight = 10;
    for(int i = 0; i < 5; ++i){
        tmp.push_back(new packitem(w[i], v[i]));
    }
    int result = maxValue(matrix, tmp, 5, bagweight);

    for(int i = 0; i < 5; ++i){
        delete tmp[i];
    }
    tmp.clear();

    cout<<result<<endl;
    return 0;
}

解决方案二:

百度背包九讲,你会找到你要的答案

解决方案三:

http://www.importnew.com/13072.html

时间: 2024-09-18 06:33:20

背包算法最优解的问题的相关文章

用coffee和socket.io实现的01背包算法

先说说我为什么写这些吧 当程序猿太苦逼了,真的,时间久了,真没有搬砖的成就感高,好歹人家能盖栋楼(身材也能练得不错),咱们指不定哪天来个熊孩子把硬盘格了就啥也没了. 这学期明显没把心放在前端上......汗啊,将来还想吃着口饭呢,但是这学期绝对没休息,只是忙了很多可能很多人认为无聊的事. 因为这学期无聊事太多了,耽误了很多,也让导师很失望,自己也很自卑,整理一下调调心态. 因为很多是针对作业的奇葩想法,所以,作业嘛,不糊弄就不是作业了,还希望大家多多批评. 兴许因为哪篇文章能解决工作呢. 我想试

算法:hdu 2639 Bone Collector II (dp 01背包求第k优解)

题目大意: 有n件物品,每件物品有体积和价值两个属性, 一个小偷带着一个大小为v的背包,要 偷这些东西,问小偷能偷的第k大的价值是多少? 思路: 这题和典型的01背包求最优解不同, 是要求第k大的解,所以,最直观的想法就是在01背包的基础上再增加一维,用来保存前k大小的数,然后在 递推时,根据前一个状态的前k 大小的数推出下一个阶段的前k个数保存下来. d[i][j][k], 表示取前i个物品,用j的费用,第k大价值是多少 在递推d[i][j][1...k]时,先获取上一个状态d[i- 1][j

算法:2n个数和是2s,取其中n个数使和最接近s

问题描述 据说是背包算法的变种求转化过程,有详解更好 解决方案 解决方案二:按大小排序,取中间n个数解决方案三:引用1楼shingoscar的回复: 按大小排序,取中间n个数 水的漂亮解决方案四:引用2楼land_L的回复: Quote: 引用1楼shingoscar的回复: 按大小排序,取中间n个数 水的漂亮 这个算法是有什么问题吗?解决方案五:vars={98,69,57,54,47,42,31,0}引用3楼shingoscar的回复: Quote: 引用2楼land_L的回复: Quote

hdu 2639 Bone Collector II (0/1背包)

点击打开链接hdu 2639 思路: 0/1背包求第k优解 分析: 1 其基本思想是,将每个状态都表示成有序队列,将状态转移方程中的 max/min 转 化成有序队列的合并. 2 这里仍然以 01 背包为例讲解一下.    首先看 01 背包求最优解的状态转移方程: F [i, v] = max{F [i − 1, v], F [i − 1, v −Ci ] + Wi }.如果要求第 K 优解,那么状态 F [i, v] 就应该是一个大小为 K 的队列F [i, v, 1 . . . K].其中

Swift 使用RSA算法进行数据加密,解密以及数字签名

RSA算法是一种非对称加密算法,要了解RSA算法,首先要知道什么是对称加密算法,什么是非对称加密算法. 1,对称加密算法 密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密. 特点:算法公开.计算量小.加密速度快.加密效率高特点.但交易双方都使用同样钥匙,安全性得不到保证. 具体算法有:DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法. 2,非对称加密算法 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).

NYOJ 311(完全背包)

有的题目要求"恰好装满背包"时的最优解,有的题目则并没有要求必须把背包装满.一种区别这两种问法的实现方法是在初始化的时候有所不同. 如果是第一种问法,要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解. 如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0. 初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态.如果要求背包恰好装满,那么此时只有容量为0

企业级云应用平台的实践和思考

今天要讲的题目是<企业级云平台的实践和思考>, 主要涉及一些基于云环境的应用构建的技术, 讲一下我在这方面的一些实践经历和一些思考, 主要讲两个参与开发的系统的功能和设计为主,不会涉及太多细节技术. 当然,我们也可以就一些点具体讨论一下. 资源管理和应用管理 基于云的应用平台,我将它分成两类: 一块是资源管理技术, 比如私有云如OpenStack.CloudStack或者公有云技术; 还有就是资源集群管理技术, 在Docker这个技术领域,个人感觉集群技术更适用. 另一块就是应用的构建和管理技

背包问题

P01: 01背包问题 题目:有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路:这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放.用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是: f[i][v] = max{ f[i-1][v], f[i-1][v-c[i]] + w[i]} 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生

请教一个用JAVA解决的问题

问题描述 请教一个用JAVA解决的问题 设有i批货,每批价值Vi,重Wi,用一个载重M的卡车装,怎么使卡车装价值最高的货物,这个怎么用JAVA解决?这个模型的有什么名字嘛? 解决方案 这就是背包算法 参考:http://blog.csdn.net/double501/article/details/5895201http://blog.sina.com.cn/s/blog_49f9904d01000auc.html 解决方案二: ??当我们用FtpClient的list函数得到了服务器的列表以后