動態規劃演算法解0 1揹包問題(C語言)

2021-08-18 22:48:52 字數 1636 閱讀 9247

問題描述:

給定 n

個物品和乙個容量為

c 的揹包,請

給出物品裝入揹包的方案,使得揹包中物品的總價值

m 最大,並

滿足: •

每個物品 

i 的重量為 wi

,價值為 vi

。 •每個物品不可拆分,要麼完整裝入揹包,要麼不在揹包裡。

• 揹包中物品的總重量不能超過容量 c。

• 程式要求

• 動態規劃的過程必須通過

dprocessing( w

i, v

i, m[

i,j] ) 

計算 •

wi表示物品 

i的重量,

• v

i 代表物品 

i的價值,

• m[ 

i,j ] 

代表當前正在規劃的重量為 

j 的揹包 的價值

• 注:動態規劃的過程禁止直接寫在主函式中!

(問題就直接用老師的實驗要求了)

#include#define n 100

int v[n];//價值

int w[n];//重量

int x[n];//是否選,1選0不選

int m[n][n];//演算法計算過程陣列

int c;//給出揹包容量

int n;//物品個數

int maxv=0;//揹包容量為c時最大價值

int max(int va,int vb)

void table()

else

} if(m[1][tc-b]==0)//第0行是0,不這樣處理一定填1

x[1]=0;

else

x[1]=1;

//printf("tc=%d\n",tc);

}void dprocessing()

} maxv=m[n][c];//揹包容量為c時最大價值

table();//確定選與不選並記入x陣列}/*

void test()

printf("%5d\n",x[i]);

} printf("\n");

printf("最大的價值是%d\n",maxv);}*/

void io()

fclose(ifp);

n=k;//單獨給n賦值

printf("檔案資料已成功讀取...\n");

dprocessing();

printf("已計算完成,正在輸出結果...\n");

ofp=fopen("output.txt","wb");

fprintf(ofp,"%d\r\n",maxv);

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

fclose(ofp);

printf("結果已輸出到本目錄檔案\"output.txt\"中...\n");

}int main()

01揹包問題 (動態規劃演算法)

0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波 面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...

01揹包問題 (動態規劃演算法)

題目 給定n種物品和乙個容量為v的揹包,物品i的體積是wi,其價值為ci。每種物品只有乙個 問 如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?面對每個物品,我們只有選擇放入或者不放入兩種選擇,每種物品只能放入一次。我們用之前同樣的思路來走一遍試試 假設只剩下最後一件物品,我們有兩種選擇 ...

動態規劃演算法 01揹包問題

動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每乙個解都對應於乙個值,我們希望找到具有最優值的解。動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的...