动态规划0—1背包问题
生活随笔
收集整理的這篇文章主要介紹了
动态规划0—1背包问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??????????????????????????????????????????????????????????????? ?動態(tài)規(guī)劃0-1背包問題
? ?? 問題描寫敘述: ?? 給定n種物品和一背包。物品i的重量是wi,其價值為vi,背包的容量為C。問應怎樣選擇裝入背包的物品,使得裝 入背包中物品的總價值最大? ? ? 對于一種物品,要么裝入背包,要么不裝。所以對于一種物品的裝入狀態(tài)能夠取0和1.我們設物品i的裝入狀態(tài)為xi,xi∈ (0,1),此問題稱為0-11背包問題。 ?????????????????????????????? 過程分析 ???? 數據:物品個數n=5,物品重量w[n]={0,2,2,6,5,4},物品價值V[n]={0,6,3,5,4,6},
???? (第0位,置為0,不參與計算,僅僅是便于與后面的下標進行統(tǒng)一,無特別用處,也可不這么處理。)總重量c=10.
?背包的最大容量為10,那么在設置數組m大小時,能夠設行列值為6和11,那么,對于m(i,j)就表示可選物品為i…n背包容量為j(總重量)時背包中所放物品的最大價值。
?
?????????????????????????????????????????
?
?
以下是自己寫的源代碼:
#include<stdio.h> #include<stdlib.h> #include<iostream> #include<queue> #include<climits> #include<cstring> using namespace std; const int c = 10; //背包的容量 const int w[] = {0,2,2,6,5,4};//物品的重量,當中0號位置不使用 。 const int v[] = {0,6,3,5,4,6};//物品相應的待加,0號位置置為空。 const int n = sizeof(w)/sizeof(w[0]) - 1 ; //n為物品的個數 int x[n+1]; void package0_1(int m[][11],const int w[],const int v[],const int n)//n代表物品的個數 {//採用從底到頂的順序來設置m[i][j]的值//首先放w[n]for(int j = 0; j <= c; j++)if(j < w[n]) m[n][j] = 0; //j小于w[n],所相應的值設為0,否則就為能夠放置 else m[n][j] = v[n];//對剩下的n-1個物品進行放置。int i;for(i = n-1; i >= 1; i--)for(int j = 0; j <= c; j++)if(j < w[i]) m[i][j] = m[i+1][j];//假設j < w[i]則,當前位置就不能放置,它等于上一個位置的值。//否則,就比較究竟是放置之后的值大,還是不放置的值大,選擇當中較大者。 else m[i][j] = m[i+1][j] > m[i+1][j-w[i]] + v[i]? m[i+1][j] : m[i+1][j-w[i]] + v[i]; } void answer(int m[][11],const int n) {int j = c;int i;for(i = 1; i <= n-1; i++)if(m[i][j] == m[i+1][j]) x[i] = 0;else { x[i] = 1;j = j - w[i];} x[n] = m[i][j] ? 1 : 0; } int main() {int m[6][11]={0};package0_1(m,w,v,n);for(int i = 0; i <= 5; i++){for(int j = 0; j <= 10; j++)printf("%2d ",m[i][j]);cout << endl; } answer(m,n);cout << "The best answer is:\n";for(int i = 1; i <= 5; i++)cout << x[i] << " ";system("pause");return 0; }
?
總結
以上是生活随笔為你收集整理的动态规划0—1背包问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到腿没劲是怎么回事
- 下一篇: 梦到有人向我借钱有什么预示