网站首页 > 文章中心 > 其它

关于01背包java代码的信息

作者:小编 更新时间:2023-08-12 11:54:14 浏览量:10人看过

关于这个java语言描述的0-1背包问题是否有错误?

有点问题:

public static void knapsack(int[]v,int[]w,int c,int[][]m)

{

int n=v.length-1;

int jMax=Math.min(w[n]-1,c);

for(int j=0;j=jMax;j++)

关于01背包java代码的信息-图1

m[n][j]=0;

for(int j=w[n];j=c;j++)

m[n][j]=v[n];

for(int i=n-1;i1;i--)

jMax=Math.min(w[i]-1,c);

m[i][j]=m[i+1][j];

for(int j=w[i];j=c;j++)

关于01背包java代码的信息-图2

m[i][j]=Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);

}

if(c=w[1])

public static void traceback(int[][]m,int[]w,int c,int[]x)

int n=w.length-1;

for(int i=1;in;i++) {

if(m[i][c]==m[i+1][c])x[i]=0;

else {

x[i]=1;

c-=w[i];

x[n]=(m[n][c]0)?1:0;

//int n=w.length-1;

for(int i=1;in;i++)

java动态规划01背包编程实现,出错怎么办

数组下标越界.

java技术类文章可以关注微信公账号:码农工作室

java语言,背包问题,从Excel表中读取数据

基本概念

问题雏形

01背包题目的雏形是:

有N件物品和一个容量为V的背包.第i件物品的体积是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大.

从这个题目中可以看出,01背包的特点就是:每种物品仅有一件,可以选择放或不放.

其状态转移方程是:

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

对于这方方程其实并不难理解,方程之中,现在需要放置的是第i件物品,这件物品的体积是c[i],价值是w[i],所以呢f[i-1][v]代表的就是不将这件物品放入背包,而f[i-1][v-c[i]]+w[i]则是代表将第i件放入背包之后的总价值,比较两者的价值,得出最大的价值存入现在的背包之中.

理解了这个方程后,将方程代入实际题目的应用之中,可得

for (i = 1; i = n; i++)

for (j = v; j = c[i]; j--)//今天这一节,背包放入物品后,容量不断的减少,直到再也放不进了

f[i][j] = max(f[i - 1][j], f[i - 1][j - c[i]] + w[i]);

问题描述

求出获得最大价值的方案.

注意:在本题中,所有的体积值均为整数.

算法分析

对于背包问题,通常的处理方法是搜索.

用递归来完成搜索,算法设计如下:

int make(int i, int j)//处理到第i件物品,剩余的空间为j 初始时i=m , j=背包总容量

if (i == 0) return 0;

if (j = c[i])//(背包剩余空间可以放下物品 i )

int r1 = make(i - 1, j - w[i]);//第i件物品放入所能得到的价值

return make(i - 1, j);//放不下物品 i

由于本题中的所有物品的体积均为整数,经过几次的选择后背包的剩余空间可能会相等,在搜索中会重复计算这些结点,所以,如果我们把搜索过程中计算过的结点的值记录下来,以保证不重复计算的话,速度就会提高很多.这是简单的"以空间换时间".

我们发现,由于这些计算过程中会出现重叠的结点,符合动态规划中子问题重叠的性质.

同时,可以看出如果通过第N次选择得到的是一个最优解的话,那么第N-1次选择的结果一定也是一个最优解.这符合动态规划中最优子问题的性质.

解决方案

考虑用动态规划的方法来解决,这里的:

阶段:在前N件物品中,选取若干件物品放入背包中

状态:在前N件物品中,选取若干件物品放入所剩空间为W的背包中的所能获得的最大价值

决策:第N件物品放或者不放

由此可以写出动态转移方程:

我们用f[i][j]表示在前 i 件物品中选择若干件放在已用空间为 j 的背包里所能获得的最大价值

f[i][j] = max(f[i - 1][j - W[i]] + P[i], f[i - 1][j]);//j = W[ i ]

这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的.所以有必要将它详细解释一下:"将前i件物品放入容量为v的背包中"这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题.如果不放第i件物品,那么问题就转化为"前i-1件物品放入容量为v的背包中",价值为f[v];如果放第i件物品,那么问题就转化为"前i-1件物品放入已用的容量为c的背包中",此时能获得的最大价值就是f[c]再加上通过放入第i件物品获得的价值w.

这样,我们可以自底向上地得出在前M件物品中取出若干件放进背包能获得的最大价值,也就是f[m,w]

算法设计如下:

int main()

cin n v;

for (int i = 1; i = n; i++)

cin c[i];//价值

关于01背包java代码的信息-图3

cin w[i];//体积

f[i][0] = 0;

for (int j = 1; j = v; j++)

if (j = w[i])//背包容量够大

f[i][j] = max(f[i - 1][j - w[i]] + c[i], f[i - 1][j]);

else//背包容量不足

f[i][j] = f[i - 1][j];

cout f[n][v] endl;

return 0;

01背包问题变种:从给定的N个正数中选取若干个数之和最接近M的JAVA写法

HXL:=V/CAPITAL*100;

D1:=INDEXC;

java实现01背包,一下为项目源码,报了一个越界异常,哪位大侠给看看.

把第二个循环中的V++修改为V--

//max(paks[v],paks[v-pak[i].cost])

if(leavepak[i].costpaks[v]paks[v-pak[i].cost])

paks[v]=pak[i].worth;

total+=pak[i].worth;

leave-=pak[i].cost;

java实现01背包,代码如下,有一个越界异常,已在代码上标注,给看下呗,若不对给点意见,多谢大侠们.

paks[v-pak[i].cost])

这个地方的问题 , 你看下那个 v - pak[i].cost 这个是会出现负数

以上就是土嘎嘎小编为大家整理的关于01背包java代码的信息相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章