1. 程式人生 > >NOIP 2001普及組 裝箱問題詳解

NOIP 2001普及組 裝箱問題詳解

這道題是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],慘痛經歷 }