洛谷 P1049 裝箱問題 (dp)
阿新 • • 發佈:2020-12-08
題目描述
有一個箱子容量為V(正整數,0≤V≤20000),同時有n個物品(0<n≤30,每個物品有一個體積(正整數)。
要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。
輸入格式
1個整數,表示箱子容量
1個整數,表示有n個物品
接下來n行,分別表示這n個物品的各自體積
輸出格式
1個整數,表示箱子剩餘空間。
輸入輸出樣例
輸入 #124 6 8 3 12 7 9 7輸出 #1
0
說明/提示
NOIp2001普及組 第4題
做一下揹包問題的筆記。
題意等價於找到小於容量的最大體積,故可以將物品體積視作物品價值。這樣一來,此題變成一道01揹包。
#include<iostream> #includedp<cstdio> #include<algorithm> #include<cstring> using namespace std; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } int main() { int m,a; m=read();a=read(); int dp[m+5],mass[a]; memset(dp,0,sizeof(dp)); for(int i=0;i<a;i++) mass[i]=read(); for(int i=0;i<a;i++) for(int j=m;j>=mass[i];j--) dp[j]=max(dp[j],dp[j-mass[i]]+mass[i]); cout<<m-dp[m]; return 0; }