c++ 装箱问题

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

HINT

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
****************************************************************/