01揹包問題(0-1 knapsack problem)
題意:先有價值為
輸入第1行輸入2個整數n,w,空格隔開。接下來n行輸入第i個物品的價值
輸出輸出總價值的最大值,佔1行
限制
輸入示例
4 54 25 2
2 18 3
輸出
題解分析
「選」與「不選」對每次的值進行更新。首先、我們要準備一些變數
struct itema[max+1];//用來存放物品資訊
int dp[max+1][10001];//dp[i][j]代表前i個物品在容量為j時的最大價值
//dp陣列的初始化
for(int i=0;i<=n;i++)
設第i的物品進入了是否放入容量為j揹包的考慮範圍:
"不選":
取最大值:
for(int i=1;i<=n;i++)
初始化的dp陣列裡的值:vw
0123
4542
0000
0052
0000
0012
0000
0083
0000
00將a[1]放入容量由0到5的揹包裡:vw
0123
4542
0044
4452
0120
830
將a[2]放入容器由0-5的揹包裡:vw
0123
4542
0044
4452
0055
9912
0830
最後形成:vw
0123
4542
0044
4452
0055
9912
0257
91183
0258
1013
**部分為:
#include#includeusing namespace std;
#define max 100
#define wmax 10001
struct itema[max+1];
int n,dp[max+1][10001];
int main()
//dp陣列的初始化
for(int i=0;i<=n;i++)
for(int i=1;i<=n;i++)
cout敲了這麼多天的**,**質量水準還是一成不變(為了解題而解題)。我們可以記錄下是哪些物品被挑選。
#include#include#includeusing namespace std;
#define nmax 105
#define wmax 10005
#define diagonal 1
#define top 0
struct item;
int n,w;
item items[nmax+1];
int c[nmax+1][wmax+1],g[nmax+1][wmax+1];
void compute(int &maxvalue,vector&selection)
for(int i=1;i<=n;i++)
c[i][0]=0;
for(int i=1;i<=n;i++)
} }maxvalue=c[n][w];
//完成統計操作
selection.clear();
for(int i=n,w=w;i>=1;i--)
} //追本溯源
reverse(selection.begin(),selection.end());
}void input()
}int main()
cout加油!
0 1揹包問題 動態規劃法
問題描述 給定n種物品和一揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 1揹包問題。資料...
0 1揹包問題 動態規劃法
問題描述 給定n種物品和一揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 1揹包問題。資料...
動態規劃法 01揹包問題
一 幾個概念 最優化問題 有 n個輸入。它的解由這 n個輸入的乙個子集組成,這個子集必須滿足某些事先給定的條件。這些條件稱為約束條件。滿足約束條件的解稱為問題的可行解。滿足約束條件的可行解可能不止乙個,為了衡量這些可行解的優劣,事先給出一定的標準,這些標準通常以函式的形式給出。這些標準函式稱為目標函...