背包问题C++已知一个载重为M的背包和n件物品,假设第i件物品的重量为wi,如果将第i件物品全部装入背包,则将获得收益p

wgpmh2022-10-04 11:39:541条回答

背包问题C++
已知一个载重为M的背包和n件物品,假设第i件物品的重量为wi,如果将第i件物品全部装入背包,则将获得收益pi。其中,wi>0, pi>0,0=

已提交,审核后显示!提交回复

共1条回复
一潭oo水007 共回答了15个问题 | 采纳率93.3%
这个可以用贪心来求。你先把每件物品的价值与质量的比值求出来。然后排序一下。按从大到小依次放入背包。直到放不下,则切割剩下比值最大的一个放入背包。
1年前

相关推荐

算法分析与设计题目 请求解0/1/2背包问题:有1个背包、其容量为C,有n种物品(每个物品种类i都自己的重量wi和价值v
算法分析与设计题目
请求解0/1/2背包问题:有1个背包、其容量为C,有n种物品(每个物品种类i都自己的重量wi和价值vi),找出一个最优装包方案,使得包内物品总价值最大(约束:物品种类i只能不装或装1个或装2个到背包内).定义该问题的最优值函数为m( i,j ):表示剩余容量为j,剩余物品种类为i,i+1,…,n时最优装包方案的物品总价值.
1)请给出m ( i,j ) 的递归计算公式
2)请给出0/1/2背包问题的动态规划算法.
3)对0/1/2背包问题的实例w=[3,2,1,4,5],v=[25,20,15,40,50],C=6用动态规划算法求解.
经过傍徨的挣扎1年前1
刻意放弃 共回答了16个问题 | 采纳率75%
(1) m(i,j)=max( m(i-1,j-w[i])+v[i] , m(i-1,j) , m(i-1,j-2*w[i])+2*v[i] );
(2) for (int i=0;i<=n;i++)
for (int j=0;j<=c;j++) m[i][j]=-10000;
m[0][0]=0;
for (int i=1;i<=n;i++)
for (int j=0;j<=c;j++)
{
m[i][j]=max(m[i][j],m[i-1][j]);
if (j+w[i]<=c) m[i][j+w[i]]=max(m[i][j+w[i]],m[i-1][j]+v[i]);
if (j+2*w[i]<=c) m[i][j+2*w[i]]=max(m[i][j+2*w[i]]+2*v[i]);
}(3)
取 2个 第二种物品,2个 第三种物品,获得价值最大为70
我也正在困惑背包问题,用堆栈,谢谢,急
我也正在困惑背包问题,用堆栈,谢谢,急
假设有一个能装入总体积为T的背包和N件体积分别为W1,W2,……,Wn的物品,能否从N件物品中挑选若干件恰好装满背包,即使W1+W2+……+Wn=T,要求找出所有满足上述条件的解。例如,当T=10,各件物品的体积为{1,8,4,3,5,2}时,可找到下列4组解:
(1 ,4 ,3 ,2)、(1 ,4 ,5)、(8 ,2)、(3 ,5, 2)。
daizhu1年前1
説不得 共回答了18个问题 | 采纳率88.9%
这个问题我已经解决了,但是你需要什么帮助呢?你哪个地方不明白吗?
动态规划 0/1背包问题(续) 求思路 怎么判断有没有装满
动态规划 0/1背包问题(续) 求思路 怎么判断有没有装满
【动态规划】0/1背包问题(续)
Time Limit:1000MS Memory Limit:65536KTotal Submit:119 Accepted:43
Description给定n种物品和一背包.物品i的重量是w[i],其价格是p[i],背包的容量为weight.
问:应该如何选择装入背包的物品,使得刚好装满背包时物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包.不能将物品i装入背包多次,也不能只装入部分的物品 Input输入共四行.
第一行为背包容量weight;
第二行为物品件数n;(n
凯子之一1年前1
yanfeng913 共回答了18个问题 | 采纳率77.8%
题目要求必须恰好装满,那你就输出动态规划后求出的f[weight],如果f[weight]没被更新过,就输入no solution.
如果题目说可以不装满,就输出f[0..weight]中的最大值.
动态规划的过程:
1.枚举每种物品i
2.枚举j=weight->0,用f[ j ]+p[ i ]去更新f[ j + w[ i ] ],由于是01背包,所以要倒着枚举
有问题请追问
证明:P≠NP时,背包问题没有多项式时间绝对近似算法.
谁忘记了谁1年前1
shenmilanlian 共回答了21个问题 | 采纳率90.5%
买2次同种饲料,两次价格不同,甲1次买1000Kg乙每次用800元 两次单价为m元y元 甲乙单价各多
一个背包问题变种(纯贪心)有一个最多能用m公斤的背包,现在有n种物品,每件的重量分别是W1,W2,...,Wn,物品能够
一个背包问题变种(纯贪心)
有一个最多能用m公斤的背包,现在有n种物品,每件的重量分别是W1,W2,...,Wn,物品能够分割(就是直接算单位重量)
每件的价值分别为C1,C2,...,Cn.若的每种物品的件数足够多.
求旅行者能获得的最大总价值.
DEP C
.说错了,每件物品最多只能取两件
zcy881年前1
cjd447 共回答了21个问题 | 采纳率90.5%
先计算出每件物品的单位重量的价值是s,s即是(Ci/Wi).
然后写一个快速排序qsort,从大到小排序.
然后逐个计算添加进去即可,直到达到背包重量m即可.
记得hdu上有一道题就跟楼主的意思差不多,太久之前的,也记得不太清楚.
若在0-1背包问题中各物品是依重量递增排列时,其价值恰好依递减序排列.对这个特殊的0-1背包问题,设计算
若在0-1背包问题中各物品是依重量递增排列时,其价值恰好依递减序排列.对这个特殊的0-1背包问题,设计算
求一个算法,要C或C++写的
jilke1年前1
蓝知 共回答了19个问题 | 采纳率84.2%
void 0_1_Knapsack(float w[], int n, float c,int x[]) //w[]为每个物品的重量,c为背包容量
{
int i;
for(i=1;i
限定物品个数的背包问题n个物品中选出m个放入背包,求最大价值.
快乐的颜颜1年前1
走错路认错人 共回答了13个问题 | 采纳率92.3%
因为问题存在明显无后效性和决策阶段性
所以应当使用动态规划求解
设函数f[i][j]表示前i件物品其中放入背包j件的最大价值,这样就可以实现转移了.
f[i][j]=max(f[i - 1][j - 1] + v[i], f[i - 1][j]);
两个决策表示取与不取第i件物品
初始状态为f[i][0]=0,f[0][i]=0
答案为f[n][m]
程序实现非常简单,LZ自己想想就知道了,呵呵
如果实在需要,LZ可以再问我要
dp动态规划中的背包问题01背包问题有几步处理并不太明白,(1)f[i][v]=max{f[i-1][v],f[i-1]
dp动态规划中的背包问题01
背包问题有几步处理并不太明白,
(1)
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
转化为
f[v]=max{f[v],f[v-c[i]]+w[i]} 时,为什么0...v的顺序要变成逆顺序 v...0
(2)
注意f[i][v]有意义当且仅当存在一个前i件物品的子集,其费用总和为v.所以按照这个方程递推完毕后,最终的答案并不一定是f[N] [V],而是f[N][0..V]的最大值.如果将状态的定义中的“恰”字去掉,在转移方程中就要再加入一项f[i][v-1],这样就可以保证f[N] [V]就是最后的答案.至于为什么这样就可以,由你自己来体会了.
还有希望可以解答上面这段话的含义.
特拉里路1年前1
tylt1314 共回答了13个问题 | 采纳率92.3%
(1)
将二维数组转化为一维数组之后,f[v]表示v的容量最多装多大价值.
如果顺序枚举的话,每种物品可能多次使用.例如某个物品重量为5,价值为10,那么就会用f[0]去更新f[5],用f[5]去更新f[10],最后出现f[0]=0,f[5]=10,f[10]=20的情况.而这是01背包,要求每种物品只能用一次.
逆序枚举时,是在f[5]被f[0]更新之前,就用f[5]更新f[10],这样就可以保证用一次.
(2)
首先要搞明白f[i][v]的定义:用前i种物品恰好装满一个容量为v的背包,最大价值是多少.
这句话的意思就是说,费用总和为v的状态可能没有意义.譬如说所有物品加在一起的重量都不到v,那么f[N][V]必然没有意义了.只能去找f[N][0..V]中的最大值来输出.
但是如果我们改变一下f[i][v]的定义:用前i种物品,在总重不超过v的情况下,最大价值是多少.
就可以直接输出f[N][V]了,这样只需要改变一下转移方程,加上一项f[i][v-1].
还有问题请追问.
C语言 典型背包问题 要源程序有一个背包,背包容量是M=150.有7个物品,物品可以分割成任意大小.要求尽可能让装入背包
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
分析:
目标函数:∑pi最大
约束条件是装入的物品总重量不超过背包容量:∑wi
我喜欢繁华的背面1年前1
乡村精典 共回答了18个问题 | 采纳率88.9%
//只是最基本的二维背包,比较好理解一点,可以有很多优化,一维也可以
#include
#define N 1001
int V[N][N],w[N],v[N];
int max(int x,int y)
{return x>y?x:y;}
int main()
{
int n,c,i,j;
scanf("%d%d",&n,&c); //n表示物体个数,c表示容量
for (i=0; i
求助一道c++背包问题 需要用递归的方法解决
求助一道c++背包问题 需要用递归的方法解决
已知背包可放入的质量为S,现有n件物品,质量分别为w1,w2,w3...wn,能否从这n件物品中选择若干件放入此背包,使之重量恰好为S,若存在一种符合要求的选择,则称背包问题有解,否则背包问题无解.
zzzzazzzz1年前1
坏男人28 共回答了16个问题 | 采纳率93.8%
1.排序,删掉大于S的物品.
2.编码,放入为1,不放入为0.一个编码100111…就是一种物品的选择.
3.从00000开始到11111,遍历一遍就OK了.
想用递归的话
1.排序,从小到大
2.从0000开始,如果总质量小于S,2进制序列加1,作为变量传送到下一层递归函数中
3.如果大于S,返回0
4.如果等于S,返回1以及当前的2进制序列
动态规划两个背包问题的状态转移方程,我就想问一下这两个方程为什么不同之处在于一个是v从cost到V,而另一个是与之相反的

动态规划两个背包问题的状态转移方程,我就想问一下这两个方程为什么不同之处在于一个是v从cost到V,而另一个是与之相反的呢 这里想不太明白 求教


zxjterry1年前1
lpsboy789 共回答了13个问题 | 采纳率92.3%
很明显,01是用了滚动数组的原理把二维数组简化为一维数组了,v to cost就是为了放过的物品不再重复放,你可以自己按步骤把数组没一次的改变列出来,就一目了然了。而完全背包物品时可以重复方的,所以循环与01相反,推荐你去看看背包九讲
贪心算法背包问题设有n=8个体积分别为54,45,43,29,23,21,14,1的物体和一个容积为C=110的背包,问
贪心算法背包问题
设有n=8个体积分别为54,45,43,29,23,21,14,1的物体和一个容积为C=110的背包,问选择哪几个物体装入背包可以使其装的最满 C/c++程序
梦回夫涯1年前1
China_rock 共回答了21个问题 | 采纳率100%
缺少物品的价值.
假设有7个物品,它们的重量和价值如下表所示.若这些物品均可以被分割,且背包容量M=140,使用贪心算法求解此背包问题.W
假设有7个物品,它们的重量和价值如下表所示.若这些物品均可以被分割,且背包容量M=140,使用贪心算法求解此背包问题.W(35,30,50,60,40,10,25)p(10,40,30,50,35,40,30)
cmz8881年前1
sdfasdfergewd 共回答了13个问题 | 采纳率84.6%
w(i)=(35,30,50,60,40,10,25)
p(i)=(10,40,30,50,35,40,30)
p(i) / w(i)=( 2/7, 4/3, 3/5, 5/6, 7/8 ,4, 6/5)
x(i)=(1, 1, 0 ,0 ,1 ,1 ,1)
(求和公式)w(i)x(i0=35*1+30*1+50*0+60*0+40*1+10*1+25*1=140
(求和公式)p(i)x(i)=10*1+40*1+30*0+50*0+35*1+40*1+30*1=155
即背包的最优解是 (1, 1, 0 ,0 ,1 ,1 ,1)
最大收益是155
(大概就是这样吧,不知道有没有计算错误,自己再看一下吧)