題目
- 題目:給出n個物品的體積,選取其中若干個物品裝入容量爲v的箱子中,剩餘空間最小爲多少?輸出這個最小值.
- 輸入格式:
- 第一行,輸入箱子的容量v.
- 第二行,輸入物品的個數n.
- 接下來n行,輸入每個物品的體積.
- 輸出格式:僅一行,輸出箱子最小剩餘空間.
- 例子:
- input:
- 24
- 6
- 8
- 3
- 12
- 7
- 9
- 7
- output:
- 0
分析
- 用
f[v]
來表示前i
個物品放入容量爲v
的箱子中的最大體積,d[i]
表示第i
個物品的體積,則狀態轉移方程爲f[v]=max(f[v],f[v-d[i]]+d[i])
,我們要的結果就在f[v]
中.
程序
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main(){
int v,n;
scanf("%d%d",&v,&n);
int d[n+1],f[v+1];
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++) scanf("%d",&d[i]);
for(int i=1;i<=n;i++)
for(int j=v;j>=1;j--)
if(j>=d[i]) f[j]=max(f[j],f[j-d[i]]+d[i]);
printf("%d",v-f[v]);
return 0;
}