CV1014装箱问题
题目描述 Description
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入描述 Input Description
一个整数v,表示箱子容量
一个整数n,表示有n个物品
接下来n个整数,分别表示这n 个物品的各自体积
输出描述 Output Description
一个整数,表示箱子剩余空间。
样例输入 Sample Input
24
6
8
3
12
7
9
7
样例输出 Sample Output
0
非常非常裸的01背包。。。不多说了
#include <iostream> #include <algorithm> #include <cstring> using namespace std; int dp[20001][30]; int getdp(int restV, int index, int n, int volumn[]) { if (index == n) return 0; if (dp[restV][index] >= 0) { return dp[restV][index]; } dp[restV][index] = getdp(restV, index + 1, n, volumn); if (restV >= volumn[index]) { dp[restV][index] = max(dp[restV][index], volumn[index] + getdp(restV - volumn[index], index + 1, n, volumn)); } return dp[restV][index]; } int main() { int V, n; int volumn[30]; cin >> V >> n; for (int i = 0; i < n; i++) { cin >> volumn[i]; } memset(dp, -1, sizeof(dp)); cout << V - getdp(V, 0, n, volumn) << endl; }