01揹包和完全揹包問題解法模板
01揹包問題
有 N 件物品和一個容量是 V 的揹包。每件物品只能使用一次。
第 i 件物品的體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。
輸出最大價值。
輸入格式
第一行兩個整數,N,V用空格隔開,分別表示物品數量和揹包容積。
接下來有 N 行,每行兩個整數 vi,wi,用空格隔開,分別表示第 ii 件物品的體積和價值。
輸出格式i
輸出一個整數,表示最大價值。
資料範圍
0<N,V≤1000
0<vi,wi≤1000
輸入樣例
4 5
1 2
2 4
3 4
4 5
輸出樣例:
8
解法一
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e3+5;
int v[N],w[N];//v體積,w價值
int f[N][N];//表示只看前i個物體,總體積是j的情況下,總價值最大是多少。
// result = max{f[n][0~V]}
// 1.不選第i個物體,f[i][j] = f[i-1][j]
// 2.選第i個物體,f[i][j] = f[i-1][j-v[i]]
int main(){
int n,bag_size;//物品數量和揹包容積
cin>>n>>bag_size;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=bag_size;j++){
f[i][j] = f[i-1][j];
if(j>=v[i]) f[i][j] = max(f[i][j],f[i-1][j-v[i]]+w[i]);
}
//int res = 0;
//for(int i=0;i<=bag_size;i++) res = max(res,f[n][i]);
cout<<f[n][bag_size]<<endl;
return 0;
}
解法二
#include<iostream>#
#include<algorithm>
using namespace std;
const int N = 1e3+5;
int v[N],w[N];//v[]體積,w[]價值
int f[N];
int main(){
int n,bag_size;//物品數量和揹包容積
cin>>n>>bag_size;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=bag_size;j>=v[i];j--)
f[j] = max(f[j],f[j-v[i]]+w[i]);
cout<<f[bag_size]<<endl;
return 0;
}
完全揹包問題(相比於01揹包,區別就是每種物體可以取無限個)
解法一
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e3+5;
int v[N],w[N];//v體積,w價值
int f[N][N];//表示只看前i個物體,總體積是j的情況下,總價值最大是多少
int main(){
int n,bag_size;//物品數量和揹包容積
cin>>n>>bag_size;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=bag_size;j++){
f[i][j] = f[i-1][j];
if(j>=v[i]) f[i][j] = max(f[i][j],f[i][j-v[i]]+w[i]);//樸素做法唯一改變點
}
cout<<f[n][bag_size]<<endl;
return 0;
}
解法二
#include<iostream>
#include<algorithm>
using namespace std;
const int N =1e3+10;
int v[N],w[N],f[N];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=v[i];j<=m;j++)
f[j] = max(f[j],f[j-v[i]]+w[i]);
cout<<f[m];
return 0;
}
-
01揹包:f(i,j) = max(f(i-1,j),f(i-1,j-v[i])+w[i])
-
完全揹包:f(i,j) = max(f(i-1,j),f(i,j-v[i])+w[i])
解法參考出處:acwing (yxc)
相關文章
- 【模板】01揹包、完全揹包
- 揹包問題(01揹包與完全揹包)
- 01揹包、完全揹包、多重揹包詳解
- 從【零錢兌換】問題看01揹包和完全揹包問題
- 01揹包問題
- 01 揹包問題
- 揹包DP——完全揹包
- 分組揹包、完全揹包
- javascript演算法基礎之01揹包,完全揹包,多重揹包實現JavaScript演算法
- 2. 01揹包問題
- 01 揹包
- 01揹包問題的解決
- 01揹包、有依賴的揹包
- HDU Piggy-Bank(完全揹包問題)
- 揹包問題
- 你真的懂01揹包問題嗎?01揹包的這幾問你能答出來嗎?
- 動態規劃 01揹包問題動態規劃
- 【動態規劃】01揹包問題動態規劃
- 動態規劃--01揹包問題動態規劃
- 動態規劃-01揹包問題動態規劃
- Codeup 貨幣系統(完全揹包問題)
- dp-完全揹包
- 【動態規劃】01揹包問題【續】動態規劃
- POJ 2184 (01揹包)
- Day 37 | 01揹包問題 、416. 分割等和子集
- 揹包九講問題
- 經典揹包問題
- 揹包問題大合集
- 部分揹包問題(挖
- 005多重揹包問題||
- 01揹包面試題系列(一)面試題
- 揹包DP——混合揹包
- 01 揹包的變形
- 51nod 1597 有限揹包計數問題 (揹包 分塊)
- 【leetcode】揹包問題彙總LeetCode
- 動態規劃系列之六01揹包問題動態規劃
- 揹包問題例題總結
- HDU - 1114 Piggy-Bank(完全揹包板題)