http://www.mamicode.com/info-detail-228421.html
動態規劃0-1揹包問題
數據:物品個數n=5,物品重量w[n]={0,2,2,6,5,4},物品價值V[n]={0,6,3,5,4,6},
(第0位,置爲0,不參與計算,僅僅是便於與後面的下標進行統一,無特別用處,也可不這麼處理。)總重量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;
}