1. 程式人生 > 實用技巧 >洛谷 P1049 裝箱問題 (dp)

洛谷 P1049 裝箱問題 (dp)

題目描述

有一個箱子容量為V(正整數,0V20000),同時有n個物品(0<n30,每個物品有一個體積(正整數)。

要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。

輸入格式

1個整數,表示箱子容量

1個整數,表示有n個物品

接下來n行,分別表示這n個物品的各自體積

輸出格式

1個整數,表示箱子剩餘空間。

輸入輸出樣例

輸入 #1
24
6
8
3
12
7
9
7
輸出 #1
0

說明/提示

NOIp2001普及組 第4題

做一下揹包問題的筆記。

題意等價於找到小於容量的最大體積,故可以將物品體積視作物品價值。這樣一來,此題變成一道01揹包。

#include<iostream>
#include
<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; }
dp