当前位置:首页 » 编程语言 » 01背包java

01背包java

发布时间: 2022-07-26 07:21:31

1. 关于这个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++)
m[n][j]=0;
for(int j=w[n];j<=c;j++)
m[n][j]=v[n];
for(int i=n-1;i>1;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;i<n;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;i<n;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;
}

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

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

for(int i=0;i<4;i++)
{
for(int v=19;v>=0;v--)
{
//max(paks[v],paks[v-pak[i].cost])
if(leave>pak[i].cost&&paks[v]<paks[v-pak[i].cost])
{
paks[v]=pak[i].worth;
total+=pak[i].worth;
leave-=pak[i].cost;
}
}
}

3. 一个算法题,类似0-1规划的,题目见详细

从大到小排序,用01背包吧,背包体积M加上一个适当的数X,然后从M到M+X,找一个最小的背包,找不到加大X的值

4. java简单算法 急急急了

  1. 冒泡排序

public static void bubbleSort(int []arr) {

for(int i =0;i<arr.length-1;i++) {

for(int j=0;j<arr.length-i-1;j++) { //-1为了防止溢出

if(arr[j]>arr[j+1]) { //把大的数放在后面

int temp = arr[j];

arr[j]=arr[j+1];

arr[j+1]=temp;

}

}

}

}

2. 希尔排序

public static void main(String [] args)

{

int[]a={49,38,65,97,76,13,27,49,78,34,12,64,1};

//希尔排序

int d=a.length;

while(true){

d=d/2;

for(int x=0;x<d;x++){

for(int i=x+d;i<a.length;i=i+d){

int temp=a[i];

int j;

for(j=i-d;j>=0&&a[j]>temp;j=j-d){

a[j+d]=a[j];

}

a[j+d]=temp;

}

}

if(d==10){

break;

}

}

}

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

数组下标越界.
java技术类文章可以关注微信公账号:码农工作室

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

BIAS0:= (C-MA(C,2))/MA(C,2)*100;
BIAS1 := (C-MA(C,12))/MA(C,12)*100;
BIAS2 := (C-MA(C,26))/MA(C,26)*100;
BIAS3 := (C-MA(C,48))/MA(C,48)*100;
HXL:=V/CAPITAL*100;
D1:=INDEXC;
D2:=MA(D1,56);
DR2:=D1/D2<0.94;
E1:=(C-HHV(C,12))/HHV(C,12)*10;
E2:=(C-REF(C,26))/REF(C,26)*10;

7. java回溯和递归的区别,主要什么回溯怎么用,有代码最好

N皇后问题的非递归迭代回溯法java代码实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class NQueen {

static int n; // 皇后个数
static int[] x; // 当前解如{0,2,4,1,3}分别代表第1、2、3、4列的行值
static int totle; // 可行方案个数
public static void main(String[] args) {
int input = 0; //输入n值
int sum = 0; //可行方案个数
String temp; //临时存储输入值
System.out.println("请输入N后问题的N值:");

try {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
temp = br.readLine();
input = Integer.parseInt(temp); //将输入值转换为int保存
if(input<=0){
throw new IOException("别输负数好不?");
}
System.out.println("输入的数是:" + input);

sum = nQueen(input); //调用nqueen方法

System.out.println("可行方案个数为:" + sum); //输出sum

} catch (IOException e) {
System.out.println(e.getMessage());

}catch (NumberFormatException e){
System.out.println("请输入数字。。。");
}
}
private static int nQueen(int input) {
n = input; //把输入给全局变量n
totle = 0; //初始化totle
x = new int[n + 1];
for (int i = 0; i <= n; i++)
x[i] = 0; //初始化x
backtrack(); //调用回溯算法
return totle;
}
private static void backtrack() {
int k = 1;
while (k > 0) {
x[k] += 1; //第k列皇后向下移一行
while ((x[k] <= n) && !(place(k))){ //如果当前第k列皇后未出界或者和其他皇后冲突
x[k] += 1; //第k列皇后向下移一行继续寻找
System.out.println("在第"+k+"行 "+"第"+x[k]+"列放置皇后");
System.out.print("当前方案为 ");
for(int i=1;i<=k;i++) //打印寻找策略
System.out.print(x[i]+" ");
System.out.println();
}
if (x[k] <= n) //找到一个值并且未出界
if (k == n) { //已是最后一列说明已找到一个方案
totle++;
System.out.print("可行方案为: ");
for (int i = 1; i <= n; i++)
System.out.print(x[i] + " ");
System.out.println();
} else { //不是最后一列故寻找下一列
k++;
x[k] = 0;
}
else //找到的值已经出界,回退到上一列
k--;
}
}
//判断皇后是否冲突
private static boolean place(int k) {
for (int j = 1; j < k; j++)
if ((Math.abs(k - j) == Math.abs(x[j] - x[k])) || (x[j] == x[k]))
return false;
return true;
}
}

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

因为你把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)

9. 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)。看上去前者要快很多。但是,可以发现在搜索中计算过的结点在动态规划中也全都要计算,而且这里算得更多(有一些在最后没有派上用场的结点我们也必须计算),在这一点上好像是矛盾的。

10. 完全背包,多重背包问题。我能求出背包的可得到最大价值,但是怎么求具体的物品加入了几件

p://www.wynpc.com/frxz" target="_blank">http://www.wynpc.com/frxz
游戏简介
凡人修真画面
《凡人修真》是一款纯正仙侠题材的角色扮演类网页游戏!斩妖屠魔、仙园建设、地标争夺、航海运镖凡人修真新手卡 凡人修真新手卡领取、万人竞技、副本冒险等特色游戏系统。 《凡人修真》游戏分为天道、九幽和星宫三大阵营,以剑仙、傀儡、阴阳、魅影和天师为基础职业,展开玩家在修真界的八方争夺之路。玩家在游戏中,可以体验装备炼造、五大职业培养等中国特色的创新玩法,并领略以秘境副本为特点的PVE玩法以及以遭遇战、竞技战、国战为代表的PVP玩法。在《凡人修真》构建的虚拟社区中,玩家或凡人修真新手卡 凡人修真新手卡领取标新立异不同凡响,或行侠仗义闯荡江湖,或号令众人攻城夺寨。 2010年最受期待的纯真仙侠题的角色扮演类网页游戏,《凡人修真》以主角实力的不断提升,探寻上古仙魔奥秘,最终飞升成仙为主线,将凡人和仙魔各界不同层次的空间往来依次展现在我们面前。崭新的画风、风趣的对白、精密的职业平衡、引人入胜的修真剧情任务、优良的系统和玩法设计,全都贯穿于整个游戏之中。
编辑本段游戏运营商介绍
目前《凡人修真》主要有4399游戏、91玩等平台联合运营。
4399平台
4399游戏平台是国内最大的网页游戏平台之一,主要经营目前最热门的网页游戏,4399游戏秉承凡人修真新手卡 凡人修真新手卡领取“服务至上、用户第一”的经营理念,力求给予用户一个良好、绿色的娱乐平台为目标,打造国际第一流的游戏的平台。如今4399游戏用户已遍及全世界,拥有庞大、忠实的用户资源,网络关键词一度排名第一,现在每天的搜索量达二十多万。
91玩平台
91wan平台以“轻松游戏、快乐生活”为宗旨,以“寓教于乐”为已任,至今同时运营10多款网页游戏,累积注册用户约2000万,每天活跃100万以上,为广大游戏爱好者提供集新奇、趣味、健康于一体的游戏新体验,全力打造多姿多彩的网上娱乐天地,最终成为旗帜鲜明的中国领先游戏娱乐平台。
编辑本段游戏界面
游戏主界面主要包括五大部分:角色信息部分、参战散修部分、聊天栏部分、玩家信息部分以及凡人修真新手卡 凡人修真新手卡领取功能菜单部分。
角色信息部分
(1)角色头像:点击可以进入玩家信息面板。 (2)国家:您所属的国家名称。 (3)等级:您当前角色的等级。 (4)角色名:您的角色名称。 (5)生命值:显示当前玩家角色的生命值和最高生命值。 (6)“+”按钮:点击自动使用背包药品恢复生命。 (7)货币信息:当前您拥有的元宝、礼券及铜钱数量。 (8)BUFF状态按钮:点击显示您当前拥有的状态信息。 (9)防沉迷图标:防沉迷系统认证链接;
参战散修列表部分
(1)下拉按钮:凡人修真新手卡 凡人修真新手卡领取点亮下拉按钮弹出当前参战散修列表。 (2)头像:散修小头像。 (3)等级:当前散修角色的等级。 (4)散修名:您的散修角色名称。 (5)生命值:显示当前散修角色的生命值和最高生命值。 (6)“+”按钮:点击自动使用背包药品恢复散修角色的生命。
聊天栏部分
(1)系统信息:显示玩家获得经验、道具、装备等信息。 (2)聊天频道选择:综合、仙盟、国家、队伍、私聊频道。 (3)聊天输入框:输入聊天内容,按Enter键发送。 (4)联系在线GM:点击“GM”,可联系在线GM。凡人修真新手卡 凡人修真新手卡领取
玩家信息部分
(1)当前所在位置:显示当前的地点名。 (2)背景音乐:点击设置音乐和音效。 (3)PK模式:显示当前玩家所处和平模式或杀戮模式。 (4)当前地点所有玩家:可以看到当前位置的其他玩家,点击“查看全部”可以看到周围更多的人。 (5)攻击:杀戮模式下,可以攻击其他玩家,即遭遇战。
功能菜单部分
(1)人物:点击进入玩家和散修角色基本信息和属性界面、坐骑界面、散修招募界面,可以看到凡人修真新手卡 凡人修真新手卡领取角色的具体信息。 (2)技能:点击可以设置护法参战、学习技能、升级技能、技能设置等相关操作。 (3)仙园:点击进入玩家的药园和洞府场景。 (4)背包:有普通背包、装备背包、宝石背包、任务背包,坐骑背包、药品背包。 (5)任务:可以查看当前任务、可接任务、日常任务。 (6)交易:交易与市场界面。 (7)仙境:七十二福地、三十六洞天、太古秘境寻宝。 (8)好友:点击进入可以添加好友、查看好友状态。 (9)仙盟:方便看到仙盟信息、仙盟成员、仙盟列表、仙盟战、仙盟商店等。 (10)组队:点击查看当前玩家组队信息。 (11)地图:清楚看到整个世界的分布,包括本国、其他国家、高级地区信息等。 (12)商店:包括热卖商店、普通商店、宝石商店和礼券商店,可以方便购买所需物品。 (13)副本传送:方便玩家直接进入副本据点,查看副本装备掉落凡人修真新手卡 凡人修真新手卡领取信息。 (14)排行榜:显示服务器内玩家的等级、仙盟、散修、荣誉、竞技场等排行榜。 (15)信件:接收系统、玩家的来信。 (16)系统设置:点击可以看到音频、显示的设置。 右边的护法信息框,可查看已招募的护法信息。
编辑本段游戏背景
相传太古时期妖魔横行,肆虐于天地之间,人类生存条件极其恶劣,更因妖魔大肆杀戮,几近灭绝!在人类存亡的最后关头,有道法通天之仙人,以无上神通将妖魔永世封印于洪荒异境;为让人类拥有自保之力,不再受妖魔之害,这位仙人在幸存的人类中挑选资质出众者,传其修仙之道,然后化为流光消失于天边……其后,凡人修真新手卡 凡人修真新手卡领取人们为纪念这位仙人,将其尊为万仙之祖,名唤“昊天”; 仙祖昊天的众弟子被后世修真者称为“古修士”,古修士道法通天,寿命堪比日月,能移山填海,御剑飞空,被凡人视为神仙;后来他们纷纷广收弟子,潜心修炼昊天所留仙法,习得神通广大的道法,但彼此却因理念不同相互敌视,相互争斗数千年;最终,被后人称为“仙陨之战”战争开始了……此役,陨落的古仙不知几凡,曾盛极一时的上古修真界渐渐没落,幸存的古修士纷纷遁入人迹罕至处潜修,不再过问外界之事…… 岁月变迁,沧海桑田;千万年后,仙祖昊天所布下的封印之力渐微,妖魔相继自无尽深渊复苏,人间浩劫即将降临……为与那无穷无尽的妖兽抗衡,修真者纷纷联合在一起,组成各大修仙者联凡人修真新手卡 凡人修真新手卡领取盟,共同守卫世间秩序!其中以三个修仙者势力最为强大,他们分别是天道、九幽、星宫…… 此时,凡间某处小镇,正有一位少年人,为追寻心中的仙道,毅然踏上修仙之路,探天地至高奥秘,寻上古仙人陨落之秘……
编辑本段阵营介绍
天道 修真界中人为守护天下苍生,缔结仙誓之盟,曰“以吾辈修士之力,扶济苍生,以正天道!” 星宫 星宫中人崇尚天地自然无为之道,不拘泥与物,自在凡人修真新手卡 凡人修真新手卡领取洒脱,追寻那飘渺的修仙之道! 九幽 天地不仁,以万物为刍狗!信奉以己身之力,匡服天地之不公,证升仙之道!

热点内容
中国移动智能宽带如何配置 发布:2025-01-25 11:59:01 浏览:774
安卓手机定时关机如何设置 发布:2025-01-25 11:50:06 浏览:318
数组缓存区 发布:2025-01-25 11:17:00 浏览:875
安卓手机键盘上浮怎么调回来 发布:2025-01-25 11:17:00 浏览:260
editplusjava编译 发布:2025-01-25 11:11:56 浏览:232
手机迅雷加密安卓 发布:2025-01-25 10:39:00 浏览:211
hdmi源码功放 发布:2025-01-25 10:38:57 浏览:598
linux账户被锁 发布:2025-01-25 10:31:27 浏览:235
安卓微信语音来电铃声怎么用自己的原声 发布:2025-01-25 10:04:03 浏览:826
mac文件夹设置 发布:2025-01-25 09:56:06 浏览:389