回溯法解决0-1背包问题 java写的 求大神指点~~~~(>_<)~~~~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回溯法解决0-1背包问题 java写的 求大神指点~~~~(>_<)~~~~相关的知识,希望对你有一定的参考价值。

代码:

import java.util.*;
public class Main
static int n;
static int c;
static int[] v = new int[n];
static int[] w = new int[n];
static int bestp=0;
public static void main(String[] args)
Scanner input = new Scanner(System.in);
n = input.nextInt();
c = input.nextInt();
for(int i=0; i<v.length; i++)
v[i] = input.nextInt();
for(int i=0; i<w.length; i++)
w[i] = input.nextInt();

Backtrack(0);
System.out.println(bestp);

public static int Bound(int i)

int b=0;
int j;
for(j=i;j<n;j++) b+=v[j];
return b;

public static void Backtrack(int i)
int cw=0;
int cp=0;
if(i>=n)
bestp=cp;
return;

if(cw+w[i]<=c)
cw+=w[i];
cp+=v[i];
Backtrack(i+1);
cw-=w[i];
cp-=v[i];

if(cp+Bound(i+1) > bestp)
Backtrack(i+1);



但出现
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at javaapplication43.Main.Backtrack(Main.java:36)
at javaapplication43.Main.main(Main.java:19)
Java Result: 1

因为你把n和c 定义为static ,而且初始化为0,。数组也为静态的,一个类中静态的变量在这个类加载的时候就会执行,所以当你这类加载的时候,你的数组static int[] v = new int[n];
static int[] w = new int[n];
就已经初始化完毕,而且数组大小为0。在main方法里动态改变n的值是改变不了已经初始化完毕的数组的大小的,因为组已经加载完毕。

我建议你可以在定义n,c是就为其赋初值。比如(static int n=2 static int c=3)
参考技术A 把这两行代码
static int[] v = new int[n];
static int[] w = new int[n];
放在
n = input.nextInt();
c = input.nextInt()
后面追问

thank you, too

分别用回溯法和动态规划求0/1背包问题(C语言代码)

希望在vc++6.0下编译通过,主要步骤有注释。满意后可追加分数!请不要网上复制。有 n 件物品, 每件物品有一个价值和一个重量,分别记为:
b1,b2, …bn
w1,w2, …wn
其中所有的 重量wi 均为整数。 现有一个背包,其最大载重量为W,要求从这n件物品中任取若干件(这些物品要么被装入要么被留下)。问背包中装入哪些物品可使得所装物品的价值和最大?

#include <stdio.h>
#include <malloc.h>
#include <windows.h>typedef struct goods

double *value; //价值
double *weight; //重量
char *select; //是否选中到方案
int num;//物品数量
double limitw; //限制重量
GOODS;
double maxvalue,totalvalue;//方案最大价值,物品总价值
char *select1; //临时数组
void backpack(GOODS *g, int i, double tw, double tv)//参数为物品i,当前选择已经达到的重量和tw,本方案可能达到的总价值

int k;
if (tw + g->weight[i] <= g->limitw)//将物品i包含在当前方案,且重量小于等于限制重量

select1[i] = 1; //选中第i个物品
if (i < g->num - 1) //若物品i不是最后一个物品
backpack(g, i + 1, tw + g->weight[i], tv); //递归调用,继续添加下一物品
else //若已到最后一个物品

for (k = 0; k < g->num; ++k) //将状态标志复制到option数组中
g->select[k] = select1[k];
maxvalue = tv; //保存当前方案的最大价值


select1[i] = 0; //取消物品i的选择状态
if (tv - g->value[i] > maxvalue)//若物品总价值减去物品i的价值还大于maxv方案中已有的价值,说明还可以继续向方案中添加物品

if (i < g->num - 1) //若物品i不是最后一个物品
backpack(g, i + 1, tw, tv - g->value[i]); //递归调用,继续加入下一物品
else //若已到最后一个物品

for (k = 0; k < g->num; ++k) //将状态标志复制到option数组中
g->select[k] = select1[k];
maxvalue = tv - g->value[i]; //保存当前方案的最大价值(从物品总价值中减去物品i的价值)



int main()

double sumweight;
GOODS g;
int i;
printf("背包最大重量:");
scanf("%lf",&g.limitw);
printf("可选物品数量:");
scanf("%d",&g.num);
if(!(g.value = (double *)malloc(sizeof(double)*g.num)))//分配内存保存物品价值

printf("内存分配失败\\n");
exit(0);

if(!(g.weight = (double *)malloc(sizeof(double)*g.num)))//分配内存保存物品的重量

printf("内存分配失败\\n");
exit(0);

if(!(g.select = (char *)malloc(sizeof(char)*g.num)))//分配内存保存物品的重量

printf("内存分配失败\\n");
exit(0);

if(!(select1 = (char *)malloc(sizeof(char)*g.num)))//分配内存保存物品的重量

printf("内存分配失败\\n");
exit(0);

totalvalue=0;
for (i = 0; i < g.num; i++)

printf("输入第%d号物品的重量和价值:",i + 1);
scanf("%lf%lf",&g.weight[i],&g.value[i]);
totalvalue+=g.value[i];//统计所有物品的价值总和

printf("\\n背包最大能装的重量为:%.2f\\n\\n",g.limitw);
for (i = 0; i < g.num; i++)
printf("第%d号物品重:%.2f,价值:%.2f\\n", i + 1, g.weight[i], g.value[i]);
for (i = 0; i < g.num; i++)//初始设各物品都没加入选择集
select1[i]=0;
maxvalue=0;//加入方案物品的总价值
backpack(&g,0,0.0,totalvalue); //第0号物品加入方案,总重量为0,所有物品价值为totalvalue
sumweight=0;
printf("\\n可将以下物品装入背包,使背包装的物品价值最大:\\n");
for (i = 0; i < g.num; ++i)
if (g.select[i])

printf("第%d号物品,重量:%.2f,价值:%.2f\\n", i + 1, g.weight[i], g.value[i]);
sumweight+=g.weight[i];

printf("\\n总重量为: %.2f,总价值为:%.2f\\n", sumweight, maxvalue );
// getch();
return 0;
参考技术A 你看你这个问题都没有人来回答,看来qq的金币还不值钱呢。、偶告诉你,使用metlab直接由 01 问题 工具包,直接调用函数解决

以上是关于回溯法解决0-1背包问题 java写的 求大神指点~~~~(>_<)~~~~的主要内容,如果未能解决你的问题,请参考以下文章

0-1背包问题的回溯法中,剪枝用的上界函数问题

0-1背包问题(回溯法)

0-1背包问题(回溯法)

0-1背包问题(回溯法)

0-1背包问题(回溯法)

0-1背包问题的回溯法代码