當前位置:首頁 » 編程語言 » 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)系統設置:點擊可以看到音頻、顯示的設置。 右邊的護法信息框,可查看已招募的護法信息。
編輯本段游戲背景
相傳太古時期妖魔橫行,肆虐於天地之間,人類生存條件極其惡劣,更因妖魔大肆殺戮,幾近滅絕!在人類存亡的最後關頭,有道法通天之仙人,以無上神通將妖魔永世封印於洪荒異境;為讓人類擁有自保之力,不再受妖魔之害,這位仙人在倖存的人類中挑選資質出眾者,傳其修仙之道,然後化為流光消失於天邊……其後,凡人修真新手卡 凡人修真新手卡領取人們為紀念這位仙人,將其尊為萬仙之祖,名喚「昊天」; 仙祖昊天的眾弟子被後世修真者稱為「古修士」,古修士道法通天,壽命堪比日月,能移山填海,御劍飛空,被凡人視為神仙;後來他們紛紛廣收弟子,潛心修煉昊天所留仙法,習得神通廣大的道法,但彼此卻因理念不同相互敵視,相互爭斗數千年;最終,被後人稱為「仙隕之戰」戰爭開始了……此役,隕落的古仙不知幾凡,曾盛極一時的上古修真界漸漸沒落,倖存的古修士紛紛遁入人跡罕至處潛修,不再過問外界之事…… 歲月變遷,滄海桑田;千萬年後,仙祖昊天所布下的封印之力漸微,妖魔相繼自無盡深淵復甦,人間浩劫即將降臨……為與那無窮無盡的妖獸抗衡,修真者紛紛聯合在一起,組成各大修仙者聯凡人修真新手卡 凡人修真新手卡領取盟,共同守衛世間秩序!其中以三個修仙者勢力最為強大,他們分別是天道、九幽、星宮…… 此時,凡間某處小鎮,正有一位少年人,為追尋心中的仙道,毅然踏上修仙之路,探天地至高奧秘,尋上古仙人隕落之秘……
編輯本段陣營介紹
天道 修真界中人為守護天下蒼生,締結仙誓之盟,曰「以吾輩修士之力,扶濟蒼生,以正天道!」 星宮 星宮中人崇尚天地自然無為之道,不拘泥與物,自在凡人修真新手卡 凡人修真新手卡領取灑脫,追尋那飄渺的修仙之道! 九幽 天地不仁,以萬物為芻狗!信奉以己身之力,匡服天地之不公,證升仙之道!

熱點內容
易語言寫ip全局代理伺服器 發布:2025-01-26 15:04:01 瀏覽:668
gm命令在哪個文件夾 發布:2025-01-26 15:03:12 瀏覽:307
javadate類 發布:2025-01-26 14:58:54 瀏覽:352
領航s1配置怎麼樣 發布:2025-01-26 09:58:10 瀏覽:763
公司區域網搭建伺服器搭建 發布:2025-01-26 09:16:56 瀏覽:433
android裁剪圓形圖片 發布:2025-01-26 09:05:56 瀏覽:411
小貸源碼 發布:2025-01-26 08:20:58 瀏覽:536
更換電腦名登錄伺服器 發布:2025-01-26 07:56:52 瀏覽:240
後台phpjava 發布:2025-01-26 07:12:34 瀏覽:657
微信解綁密碼是什麼 發布:2025-01-26 06:50:07 瀏覽:734