99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

背包問題java代碼 java解決背包問題

_'>回溯法解決0-1背包問題 java寫的 求大神指點~~~~(>_

因為你把n和c 定義為static ,而且初始化為0,。數組也為靜態的,一個類中靜態的變量在這個類加載的時候就會執行,所以當你這類加載的時候,你的數組static int[] v = new int[n];

創新互聯是一家集網站建設,營山企業網站建設,營山品牌網站建設,網站定制,營山網站建設報價,網絡營銷,網絡優化,營山網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力??沙浞譂M足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。

static int[] w = new int[n];

就已經初始化完畢,而且數組大小為0。在main方法里動態改變n的值是改變不了已經初始化完畢的數組的大小的,因為組已經加載完畢。

我建議你可以在定義n,c是就為其賦初值。比如(static int n=2 static int c=3)

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件物品中,選取若干件物品放入所??臻g為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語言描述的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;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;

}

網站欄目:背包問題java代碼 java解決背包問題
文章鏈接:http://www.yijiale78.com/article4/ddjgcie.html

成都網站建設公司_創新互聯,為您提供做網站、微信公眾號網站收錄、手機網站建設、云服務器自適應網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站網頁設計