c語言資料結構 01揹包問題 動態規劃

2022-03-20 07:12:56 字數 1341 閱讀 9557

兩天的時間都在學習動態規劃:小作業(01揹包問題:)

資料結構老師布置的這個小作業還真是讓人傷頭腦,自己實在想不出來了便去網上尋找講解,看到一篇不錯的文章:

-------通過金礦模型介紹動態規劃

但是----------------------------------------

兩天的時間才完成這個lab

總結:1.思維思路要清晰。2.題目資訊要看清楚。3.改**過程中注意小變數的數值是否同步變化。

01揹包問題思路(自頂向下):

揹包承重為u。假設有十個物品,從左往右依次編號排列,可以採取如下步驟:

1.站在第10個物品處,乙個物品只有選擇和未被選擇兩種情況,如果選擇了當前物品,那麼選了它之後跟不選它所得到的價值誰大一點?其實我們採用遞迴兩種情況都會考慮的

i:當前物品重量大於u,那肯定就不能選擇這個物品,直接就考慮前9個物品的選擇情況了,此時去看第九個物品。

ii:當前物品重量小於u,可以選擇也可以不選擇,但是我們要看哪種情況更好,更優:選擇這個物品,假設前9個物品的選擇最優情況(此時揹包容量會變小,因為選擇了第10個物品)我們已經得知了,此時可以得到在選擇第10個物品的情況下的價值,而如果不選擇這個物品,那麼我們同樣假設前9個物品的最優選擇情況(此時揹包容量還是u)已經得知了,那麼我們從這選與不選的兩種情況中選擇最大的一種方案下就是原問題的最優解了。

iii:這是遞迴的過程,每個問題都需要有前面的最好的選擇方案才可以得出最優解,所以需要乙個遞推邊界情況,當考慮第乙個物品的時候,也就是考慮的物品中剩餘的最後乙個的時候,如果不選,因為前面已經沒有物品了,所以什麼也放不進揹包,得到的價值是0;如果選了,那就是當前物品的價值。

貼**:

#include#include#includeint max_o,max_w;

#define max_o (3)

#define max_w (50)

int weight[max_o]; //用來儲存物品重量

int value[max_o]; //用來儲存物品價值

int pri[max_o]; //用來標記物品是否被選擇

int maxval[max_o]; //用來作備忘

void inia()

int getmax(int maxweight,int max_n)

}else if(weight[max_n]<=maxweight)

else

maxval[max_n] = maxret;

return maxret;

}void main()

printf("%d\n",getmax(max_w,max_o-1));

for(i=0;i}

資料結構筆記 46 動態規劃(01揹包問題)

下面是演算法的介紹 先看乙個例項 揹包問題 輸出 package com.huey.dynamic public class knapsackproblem 物品的重量 int val 物品的價值 這裡的val i 就是前面講的v i int m 4 揹包的容量 int n val.length 物...

0 1揹包問題 C語言

cw表示已裝重量和,i表示考察到第i個物品,w表示揹包可承受重量,n表示物品個數,物品重量儲存在陣列a中,max表示當前最大值 void bag int i,int cw,int w,int n,int item,int max return bag i 1,cw,w,n,item,max if c...

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...