揹包問題(未完成)
阿新 • • 發佈:2021-07-14
目錄
揹包問題
- 挑東西的問題
01揹包_選與不選的問題
- 迴圈變數從大到小,避免重複(否則將變成完全揹包)
- f[N]表示的是在N的資源下達成的結果,這裡的N的資源並不是處在all in的狀態,而是可以允許閒置的狀態。
- 當前的狀態從何而來?一般是消耗一定的資源來換取一定的成果。
- 有些題目存在開啟條件,如278. 數字組合,所有的數字起源都來自於0,要令f[0]=1,從而通過f[0]=1來初始化其他的數字
1024.裝箱問題
有一個箱子容量為 V,同時有 n 個物品,每個物品有一個體積(正整數)。
要求 n 個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。
- 儘可能拉大體積
#include<bits/stdc++.h> using namespace std; int main() { int V; int n; cin>>V>>n; int f[V+1],v; memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) { cin>>v; for(int j=V;j>=v;j--) { f[j]=max(f[j],f[j-v]+v); } } cout<<V-f[V]; return 0; }
278. 數字組合
給定 N個正整數 A1,A2,…,AN,從中選出若干個數,使它們的和為 M,求有多少種選擇方案。
#include<bits/stdc++.h> using namespace std; int main() { int n,m; cin>>n>>m; int f[m+1]; memset(f,0,sizeof(f)); f[0]=1; for(int i=0;i<n;i++) { int x; cin>>x; for(int j=m;j>=x;j--) f[j]=f[j]+f[j-x]; } cout<<f[m]; return 0; }
完全揹包_選多和選少的問題
二維費用的揹包問題_站在01揹包的肩上
- 由
f[狀態型別1]
變成f[狀態型別1][狀態型別2]
8. 二維費用的揹包問題
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
int main()
{
int N,VOL,WEI;
cin>>N>>VOL>>WEI;
int vol,wei,val;
int f[VOL+1][WEI+1];
memset(f,0,sizeof(f));
for(int i=0;i<N;i++)
{
cin>>vol>>wei>>val;
for(int j=VOL;j>=vol;j--)
for(int k=WEI;k>=wei;k--)
{
f[j][k]=max(f[j][k],f[j-vol][k-wei]+val);
}
}
cout<<f[VOL][WEI]<<endl;
return 0;
}