装箱问题
Description
有一个箱子容量为V(正整数,0 ≤ V ≤ 20000),同时有n个物品(0 < n ≤ 30),每个物品有一个体积(正整数)。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
Input
输入有若干行。第一行:一个整数,表示箱子容量V;第二行:一个整数,表示物品个数n;接下来n行,分别表示这n个物品的各自体积。
Output
输出只有一行数据,该行只有一个数,表示最小的箱子剩余空间。
Sample Input
24 6 8 3 12 7 9 7
Sample Output
0
Source
#include <bits/stdc++.h> using namespace std; bool f[20001]; int n, a[31], v; int main() { cin >> v >> n; for (int i = 1; i <= n; i ++) { scanf("%d", &a[i]); } memset (f, 0, sizeof(f)); f[0] = 1; for (int i = 1; i <= n; i ++) { for (int j = v; j >= 0; j --) { if (f[j] == 1 && j + a[i] <= v) { f[j + a[i]] = 1; } } } int ans = 0; for (int i = v; i >= 0; i --) { if (f[i] == 1) { ans = i; break; } } cout << v - ans << endl; return 0; } /************************************************************** Problem: 1603 User: LJA001162 Language: C++ Result: 正确 Time:0 ms Memory:1556 kb ****************************************************************/