社区
C#
帖子详情
[100分]背包问题的算法(思路易可)
jryu2k5
2009-03-14 03:26:31
已知:有无限个标准背包B,容量为BMax
还有剩余背包B1,B2....BN个,其剩余容量分别为R1,R2...RN
现有物品W1,W2....WN个,其体积为V1,V2...VN,个数为A1,A2...AN
求:一方案将所有的物品都装进背包且要求用于装物品的背包的剩余空间最少。
PS:不是求近似的最优解,而是直接求最优解的算法,而且算法不能太耗时,应为物品的数量可能在1k或以上。
...全文
413
11
打赏
收藏
[100分]背包问题的算法(思路易可)
已知:有无限个标准背包B,容量为BMax 还有剩余背包B1,B2....BN个,其剩余容量分别为R1,R2...RN 现有物品W1,W2....WN个,其体积为V1,V2...VN,个数为A1,A2...AN 求:一方案将所有的物品都装进背包且要求用于装物品的背包的剩余空间最少。 PS:不是求近似的最优解,而是直接求最优解的算法,而且算法不能太耗时,应为物品的数量可能在1k或以上。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jryu2k5
2009-03-15
打赏
举报
回复
我也想过贪心算法,遗传算法,动态规划算法等,这些算法可能对于单一的背包问题可能有效,但是该问题是包含无限个标准背包,其容量大小固定,而且还有N个剩余的背包,而且物品的个数不一定就是一个,可以是多个,求的是装完所有物品所使用的背包的剩余空间最小,若使用贪心算法岂不是要每个背包都运算一次,再来一次统计可能的解决方案,再将解决方案无法解决的物品组合放到标准背包里,假如背包剩余的个数不是简单的一百个,而是一万,甚至10万或更多呢?这样的算法岂不是要一两天才计算出来,这很明显是无法接受的。所以,我想要的是一种具有效能的算法,可以将求解的过程缩短
fskjb01
2009-03-14
打赏
举报
回复
好高深啊。。。。
zj15919739808
2009-03-14
打赏
举报
回复
顶一个
jlj84237485
2009-03-14
打赏
举报
回复
帮顶一下
genius_tong
2009-03-14
打赏
举报
回复
参考下:http://download.csdn.net/source/780723
shiboss
2009-03-14
打赏
举报
回复
三楼已经比较详细了
zhaigates
2009-03-14
打赏
举报
回复
学习
大雷子老师
2009-03-14
打赏
举报
回复
顶一下。
teerhu
2009-03-14
打赏
举报
回复
背包问题的贪心算法
/**
*
*/
/**
* @author Administrator
*
*/
/**
* 背包问题 ----
* 已知有n种物品和一个可容纳M重量的背包,每种物品i的重量是w[i]。假定将物品i的一部分x[i]放入背包就会得到p[i]x[i]的效益,这里,
* 0<=x[i]<=1,p[i]>0.采用怎样的方法才能使装包的效益最大呢?
* 考虑以下情况下的背包问题:n = 3,M = 20,(p0,p1,p2) = (25,24,15),(w0,w1,w2) =
* (18,15,10).其中的4个可行解是
* (x0,x1,x2) w0x0 + w1x1 + w2x2 p0x0 + p1x1 + p2x2
* (1/2,1/3,1/4) 16.5 24.25
* (1,2/15,0) 20 28.2
* (0,2/3,1) 20 31
* (0,1,1/2) 20 31.5
* 在这4个可行解中第四个的效益值最大。 定理:如果 p1/w1>=p2/w2>=...>=pn/wn,则算法对于给定的背包问题实例生成一个最优解。 证明:
* 设X= (x1,...,xn)是最优解。如果所有的xi = 1,显然这个解是最优解。于是,设j是使xj != 1 的最小下标。由算法可知,对于1<=i<=j
* ,xi=1;对于 j<i<=n,xi =0;对于j, 0<=xj<1.如果X不是一个最优解,则必定存在一个可行解Y=(y1,...yn),使得
* piyi > pixi.不失 一般性,可以假定 wiyi =M.设k是使得yk!=xk的最小下标。显然,这样的k必定存在。由上面的假设,可以推得yk<xk.
* 这可从3种可能发生的情况,即k<j,k=j,k>j分别得到证明: (1)若k<j,则xk = 1.因yk!=xk,从而yk<xk. (2)若k=j ,由于 ∑wjxi =
* M,且对1<=i<j,有xi=yi=1,而对j<i<=n,有xi =0.若yk>xk,显然有∑wiyi>M,与Y是可行解矛盾。若yk=xk
* ,与假设yk!=xk矛盾,故yk<xk. (3)若k>j,则∑wiyi>m,这是不可能的。
* 现在,假定把yk增加到xk,那么必须从(yk+1,...,yn)中减去同样多的量,使得所有的总容量仍是M。这导致一个新的解Z=(z1,...zn),
* 其中,zi = xi , 1<=i<=k,并且∑(k<i<=n)wi(yi-zi)= wk(zk-yk).因此,对于Z有
* ∑pizi = ∑piyi + (zk-yk)wkpk/wk-∑(k<i<=n)(yi-zi)wipi/wi
* >= ∑piyi +[(zk-yk)wk-∑(yi-zi)wi]pk/wk
* = ∑piyi
* 如果∑pizi>∑piyi,则Y不可能是最优解。如果这两个和数相等,同时Z=X,则X就是最优解;若Z!=X,则重复上面的讨论,或者证明Y不是最
* 优解,或者把Y转换成X,从而证明了X也是最优解。证毕。
*/
public class BinSerch {
//对数组buf降序排列 同时 index 数组记录排序前的数组索引
public static void order(double[] buf, int[] index) {
int count = 1;
while (count++ < buf.length) {
for (int i = buf.length - 1; i > 0; i--) {
if (buf[i] > buf[i - 1]) {
double temp = buf[i];
buf[i] = buf[i - 1];
buf[i - 1] = temp;
int temp1 = index[i];
index[i] = index[i - 1];
index[i - 1] = temp1;
} else
continue;
}
}
for (int j = 0; j < buf.length; j++) {
System.out.print(buf[j] + "(" + j + ")");
}
System.out.println();
}
public static void main(String[] args) {
//对上述背包问题求最优解
int n = 3; //物品数量
double[] p = { 25, 24, 15 }; //效益数组
double[] w = { 18, 15, 10 }; //重量数组
double[] pw = { p[0] / w[0], p[1] / w[1], p[2] / w[2] }; //选取pi/wi为其量度标准
int[] index = { 0, 1, 2 }; //数组索引
double[] record = new double[3];//记录排序前数组下标
double cu = 20; //背包剩余容量
order(pw, index); //排序
//背包问题的贪心算法
int i = 0;
for (i = 0; i < n; i++) {
if (w[index[i]] < cu) {
record[i] = 1;
cu = cu - w[index[i]];
} else {
break;
}
}
if (i < n) {
record[i] = cu / w[index[i]];
}
for (int j = 0; j < record.length; j++) {
System.out.print("x" + j + "\t");
System.out.print(record[j] + "\t");
}
}
}
wuyi8808
2009-03-14
打赏
举报
回复
这个应该到算法版去提问
:
https://forum.csdn.net/SList/ST_Arithmetic
格拉
2009-03-14
打赏
举报
回复
运筹学里的东西,抱歉,专业没学好
acwing
算法
基础课——
背包问题
笔记
背包问题
: 1. 01
背包问题
(每件物品只使用一次) 2. 完全
背包问题
(每件物品可以重复使用) 3. 多重
背包问题
4.
分
组
背包问题
(物品有n组,每组物品有若干种,一组物品中只能选一种) 文章目录
背包问题
:前言一、01
背包问题
1.题目描述2.问题
分
析3.状态表达式4.朴素代码(二维):5.优化代码(一维)二、完全
背包问题
1.引入库2.读入数据总结 前言 本来是打算按照acwing
算法
基础课的顺序学的,但是对
背包问题
比较感兴趣,就想先把
背包问题
给学完。 一、01
背包问题
1.题目描述
Python:贪心
算法
_
背包问题
国庆假期闲暇时间看了
背包问题
的博客,“动态规划之01
背包问题
(最
易
理解的讲解)”。文中使用actionscript3 的代码,这里使用Python码一遍。 先介绍
思路
: 0.物品重量列表Weight=[2,2,6,5,4],
【动态规划】
背包问题
-01背包详解(二维数组理解&一维数组优化)
背包问题
有部
分
背包问题
、01
背包问题
、完全
背包问题
、多重
背包问题
以及混合
背包问题
等几种,其中01背包是最为基础的,理解全了01
背包问题
,其他的
背包问题
都迎刃而解。 问题描述 有N件物品和一个容量为M的背包,设第i件物品的费用(体积\重量)是w[i],价值是c[i]。求解如何选择物品可以使得费用(体积\重量)总和不超过背包容量V,且价值最大。 01背包的特点:每种物品只有一件,可以选择放或不放 01背包状态
分
析 首先复习一下动态规划的核心思想:将每个状态的最优值记录下来 状态设置:...
算法
实验之贪心策略求解
背包问题
1 问题描述 0-1
背包问题
:给定n种物品和一个背包。物品i的重量是,其价值为,背包的容量为W。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包(1)或不装入背包(0)。不能将物品i装入背包多次,也不能只装入部
分
的物品i。
背包问题
:给定n种物品和一个背包。物品i的重量是,其价值为,背包的容量为W。应如何选择装入
【贪心
算法
】
背包问题
C++
题目有一个背包,背包容量是M=150。有7个物品,物品可以
分
割成任意大小。 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。 物品 A B C D E F G 重量 35 30 60 50 40 10 25 价值 10 40 30 50 35 40 30
思路
使用贪心
算法
,每次选择单位重量价值最
C#
111,126
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章