NOIP 2001普及組 裝箱問題詳解
阿新 • • 發佈:2019-01-07
這道題是01揹包的經典例題
核心儲存狀態的陣列f[],f[i]表示容量為i時的最優解
兩重迴圈,第一層列舉物品,第二層列舉所有容量,而狀態轉移方程的核心就是選不選擇這種物品兩種情況,f[i]就相當於不選,保持原來的狀態;f[i-a[i]]+a[i]相當於選,就是把當前容量v-當前物品體積a[i]時的最優解加上當前物品體積a[i]
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 31
#define MAXV 20001
using namespace std;
int v,n,a[MAXN],f[MAXV];
int main()
{
cin>>v>>n;
for (int i=1;i<=n;i++){
cin>>a[i];
}
for (int i=1;i<=n;i++){
for (int j=v;j>=a[i];j--){ //因為容量必須大於當前要放入的物品,所以直接到a[i],可以省時間
f[j]=max(f[j],f[j-a[i]]+a[i]); //選與不選兩種情況
}
}
cout <<v-f[v]<<endl;//千萬不要直接輸出f[v],慘痛經歷
}