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[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
*/