0-1揹包問題

1. 0-1揹包問題

0-1揹包問題模型:

一個總容量V的揹包和N件物品,每件物品都有其體積w,價值v;每個物品是否在揹包中即0-1情況,故稱該種問題爲0-1揹包問題。要求揹包能裝下價值儘可能多的物品,求最大價值;

狀態描述:dp[i][j]表示第i件物品對於當前佔用容量爲j的價值狀態,其中1<=i<=n,0<=j<=V;

狀態分析:第i件物品是否加入揹包,

                (1)加入,dp[i][j]等於dp[i-1][j-w]+v,第i-1件相對於j-wi的佔容最大價值的最大價值加第i件價值;

                  (2)   沒加入,d[i][j]等於dp[i-1][j],即與第i-1件到j佔容的最大價值;

 狀態轉換:

 \\dp[0][j]&=0; \\dp[i][j]&=max\lbrace dp[i-1][j-w]+v,dp[i-1][j]\rbrace (j-w> 0)

轉換結果:dp[N][V],第N件物品到佔容爲V的最大價值狀態

測試數據:

71 100
69 1
1 2

狀態分析表如下所示:

i \ j 1 ... 68 69 70
1 0 ... 0 0 0
2 0 ... 0 1 1
3 2 ... 2 2 1+2

 

 Code:

#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
int V,N;//V爲容量,N爲個數
vector<int> dpcol(1000,0);
vector<vector<int>> dp(100,dpcol);//N<=100,V<=1000
struct goods{
	int w;//權重或表示爲佔容
	int v;//價值value
};
vector<goods> goods(100,{0,0});
int main(){
	int w,v;
	while(cin>>V>>N){
		for(int i=1;i<=N;i++){
			cin>>w>>v;
			goods[i]={w,v};
		}//輸入物品
		for(int j=1;j<=V;j++){
			dp[0][j]=0;
		}//初始化第0件狀態
		for(int i=1;i<=N;i++){//物品
			for(int j=goods[i].w;j<=V;j++){//體積致該件w起
				dp[i][j]=max(dp[i-1][j-goods[i].w]+goods[i].v,dp[i-1][j]);
			}
		}
		cout<<dp[N][V]<<endl;
	}
	return 0;
}
/**
70 3
71 100
69 1
1 2

3
 */

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章