
有一个箱子容量为V(正整数,0 ≤ V ≤ 20000),同时有n个物品(0<n ≤ 30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
题目
- 原题地址:装箱问题
- 题目编号:NC16693
- 题目类型:DP、01背包
- 时间限制:C/C++ 1秒,其他语言2秒
- 空间限制:C/C++ 262144K,其他语言524288K
1.题目大意
n个物品任取若干个装入箱内,求箱子的剩余空间的最小值
2.题目分析
c[i][j]表示前i个物品在容量为j时的最大体积
3.题目代码
#include <bits/stdc++.h>
using namespace std;
int n, v, a[35], c[35][20005];
int dp(int i,int j) {
if(c[i][j]>0) return c[i][j];
if(!i) return 0;
c[i][j] = (j>=a[i-1])?max(dp(i-1,j),dp(i-1,j-a[i-1])+a[i-1]):dp(i-1,j);
return c[i][j];
}
int main() {
cin >> v >> n;
for(int i=0;i<n;i++) cin >> a[i];
cout << v-dp(n,v) << endl;
}