##[$AcWing$ $1024$. 装箱问题](https://www.acwing.com/problem/content/1026/) ### 一、题目描述 有一个箱子容量为 $V$,同时有 $n$ 个物品,每个物品有一个体积(正整数)。 要求 $n$ 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。 **输入格式** 第一行是一个整数 $V$,表示箱子容量。 第二行是一个整数 $n$,表示物品数。 接下来 $n$ 行,每行一个正整数(不超过$10000$),分别表示这 $n$ 个物品的各自体积。 **输出格式** 一个整数,表示箱子剩余空间。 **数据范围** $0 using namespace std; const int N = 40, M = 10010; int n, m; int f[N][M * N]; int v[N]; int main() { cin >> m >> n; for (int i = 1; i <= n; i++) cin >> v[i]; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { f[i][j] = f[i - 1][j]; if (j >= v[i]) f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + v[i]); } printf("%d\n", m - f[n][m]); return 0; } ``` ### 四、一维数组写法 ```cpp {.line-numbers} #include using namespace std; const int N = 20010; int n, m; int v[N]; int f[N]; int main() { cin >> m >> n; for (int i = 1; i <= n; i++) cin >> v[i]; // 01背包模板 for (int i = 1; i <= n; i++) for (int j = m; j >= v[i]; j--) f[j] = max(f[j], f[j - v[i]] + v[i]); // 输出 printf("%d", m - f[m]); return 0; } ```