2.舉例:揹包問題。有n件物品和容量為c的揹包,給出物品的重量及價值,求解怎樣選擇物品才能使裝入揹包的物品重量不超過揹包容量且價值最大?
3.c語言實現:上述揹包問題中,每一件物品只能選擇裝入揹包和不裝入揹包,不能選擇裝入多次,也不能裝入物品的一部分,所以此問題為0-1揹包問題。
#include //準備工作
int v[100][100];
//求最大值
int max(int a, int b)
//最優矩陣
void package(int *w, int *v, int n, int c)
} }
//最優解
void solution(int *w, int *v, int n, int c, int *s)
else
s[i] = 0; //沒有放入揹包
} }//主函式
int main()
; //物品重量
int v[5] = ; //物品價值
int n = 5; //物品件數
int c = 10; //揹包容量
int s[5]; //選取d的物品
int i,j;
package(w, v, n, c);
printf("最優矩陣為:\n"); //列印
for(i = 0; i <= n; i++)
solution(w, v, n, c, s);
printf("最優解,即對應放入揹包的物品為:\n"); //列印
for(i = 1; i <= n; i++)
printf("%d", s[i]);
printf("\n");
printf("最大價值為:\n");
printf("%d", v[n][c]);
return 0;
}
4.結果:
5.總結:
在判斷當前物品是否可以裝入揹包時,要將揹包剩餘容量和當前物品重量比較,如果無法放入當前物品,則此時揹包的最大價值與放入之前物品的最大價值相同;如果可以放入當前物品,就要決定是否放入當前物品,其中0表示不放入,1表示放入。
當決定不放入當前物品,此時揹包的最大價值與放入之前物品的最大價值相同;當決定放入當前物品,在保留當前物品的揹包容量後,再選擇之前物品的最大價值組合,此時揹包的最大價值等於當前物品的價值加上之前物品的最大價值組合。
最後通過求兩種情況下價值的最大值,即可得到最終揹包的最大價值。
在判斷哪些物品被裝入揹包時,要從揹包的最大價值開始進行回溯,當裝入當前物品的揹包最大價值與裝入之前物品的揹包最大價值不同時,可判斷當前物品被裝入揹包。
6.參考
文章1文章2文章3
演算法思想 動態規劃
我所理解的動態規劃,其本質是對遞迴的優化。所以一般需要先找出其遞迴方式,才能進一步地優化。但是,只要刷題數量達到了一定程度,就會隱約感覺到有乙個解題模板,只需要按照這個模板去比對各種條件就可以解題。狀態,動態規劃都會使用到輔助陣列來記錄問題的解,這些陣列的下標具有重要作用,一定要弄明白下標究竟表示哪...
揹包dp的核心思想(動態規劃)
突然發現我一直沒有真正理解揹包,真正的揹包應該是用空間換時間的一種dp方法,本質上就是n個物品選或不選,理論上有2 n2 n 2n種可能結果,但是揹包利用的就是值域很小這一特點來重疊子結構,所以揹包本質上處理的應該是乙個集合中的所有物品,選或不選對應權值的變化。有時候這樣的權值甚至是多維度的,我們進...
動態規劃 思想
動態規劃 把問題劃分成子問題遞迴求解,並且保留中間結果以避免重複計算子問題的方法,叫動態規劃。eg 三角形路徑數字之和 關鍵思想 1,劃分成若干子問題 2,子問題的狀態,及若干狀態值 狀態的表述。3,子狀態之間的轉換 即遞迴求解,子狀態到上一級子狀態之間的變換關係 即如何從乙個或多個值已知的狀態,求...