背包java算法代码 背包 java

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

有点问题:

10年积累的网站制作、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有沛县免费网站建设让你可以放心的选择与我们合作。

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++)

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);

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

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

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

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

}

m[1][c]=m[2][c];

if(c=w[1])

m[1][c]=Math.max(m[1][c],m[2][c-w[1]]+v[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++)

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;

}

0-1背包问题java代码

import java.io.BufferedInputStream;

import java.util.Scanner;

public class test {

public static int[] weight = new int[101];

public static int[] value = new int[101];

public static void main(String[] args) {

Scanner cin = new Scanner(new BufferedInputStream(System.in));

int n = cin.nextInt();

int W = cin.nextInt();

for (int i = 0; i  n; ++i) {

weight[i] = cin.nextInt();

value[i] = cin.nextInt();

}

cin.close();

System.out.println(solve(0, W, n)); // 普通递归

System.out.println("=========");

System.out.println(solve2(weight, value, W)); // 动态规划表

}

public static int solve(int i, int W, int n) {

int res;

if (i == n) {

res = 0;

} else if (W  weight[i]) {

res = solve(i + 1, W, n);

} else {

res = Math.max(solve(i + 1, W, n), solve(i + 1, W - weight[i], n) + value[i]);

}

return res;

}

public static int solve2(int[] weight, int[] value, int W) {

int[][] dp = new int[weight.length + 1][W + 1];

for (int i = weight.length - 1; i = 0; --i) {

for (int j = W; j = 0; --j) {

dp[i][j] = dp[i + 1][j]; // 从右下往左上,i+1就是刚刚记忆过的背包装到i+1重量时的最大价值

if (j + weight[i] = W) { // dp[i][j]就是背包已经装了j的重量时,能够获得的最大价值

dp[i][j] = Math.max(dp[i][j], value[i] + dp[i + 1][j + weight[i]]);

// 当背包重量为j时,要么沿用刚刚装的,本次不装,最大价值dp[i][j],要么就把这个重物装了,那么此时背包装的重量为j+weight[i],

// 用本次的价值value[i]加上背包已经装了j+weight[i]时还能获得的最大价值,因为是从底下往上,刚刚上一步算过,可以直接用dp[i+1][j+weight[i]]。

// 然后选取本次不装weight[i]重物时获得的最大价值以及本次装weight[i]重物获得的最大价值两者之间的最大值

}

}

}

return dp[0][0];

}

}

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件物品放入所能得到的价值

int r2 = make(i - 1, j);//第i件物品不放所能得到的价值

return min(r1, r2);

}

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

}

这个算法的时间复杂度是O(n^2),我们可以做一些简单的优化。

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

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

同时,可以看出如果通过第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];//价值

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

cin w[i];//体积

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

f[i][0] = 0;

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

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;

}

由于是用了一个二重循环,这个算法的时间复杂度是O(n*w)。而用搜索的时候,当出现最坏的情况,也就是所有的结点都没有重叠,那么它的时间复杂度是O(2^n)。看上去前者要快很多。但是,可以发现在搜索中计算过的结点在动态规划中也全都要计算,而且这里算得更多(有一些在最后没有派上用场的结点我们也必须计算),在这一点上好像是矛盾的。

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

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

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

java算法背包溢出最小值

java算法背包溢出最小值最小值-1,即最小值+(-1),即1-0000加1-1111,变成0-1111。

最大值+1,即0-1111加0-0001,变成1-0000,即最小值最小值-1,即最小值+(-1),即1-0000加1-1111,变成0-1111,即最大值正数区间和负数区间形成了循环,正数区间最大值+1,就进入了负数区间,负数区间最大值+1,就进入了正数区间。

基本信息

数据结构与算法课程是电子科技大学于2018年02月26日首次在中国大学MOOC开设的慕课课程、国家精品在线开放课程。该课程授课教师为林劼、戴波、刘震、周益民。据2021年3月中国大学MOOC官网显示,该课程已开课7次。

数据结构与算法课程共6个模块,包括绪论、线性表、查找、排序、递归与分治、树与二叉树、图论与贪心算法、动态规划等内容。

数据结构与算法课程是计算机科学与技术的学科基础课程,也是是计算机图形学、计算机网络、编译原理、计算机操作系统等后续课程的基础理论之一,其应用范围也早已扩展到图像处理与模式识别、海量数据挖掘、科学数据处理、复杂网络分析等许多计算机前沿领域。


标题名称:背包java算法代码 背包 java
标题来源:http://hbruida.cn/article/docpphj.html