#include <iostream>
#include <algorithm>
#include <cmath>
#define endl '\n'
#define int long long // 使用long long类型
using namespace std;
int v, n; // v: 背包总容量,n: 物品数量
int arr[100010]; // arr[i]表示第i个物品的体积
int sum; // 未使用的变量,原可能用于累计和(可忽略)
int res = 999; // 记录最小剩余容量(初始值应为v)
// 深度优先搜索尝试所有可能的物品组合
// 参数说明:x-当前处理的物品下标,start-当前剩余可用容量
void dfs(int x, int start) {
// 每次递归先更新最小剩余容量(若当前start更小)
res = min(res, start);
// 递归终止条件:所有物品已处理完毕
if (x == n + 1) return;
// 情况1:不选当前物品,处理下一个物品,剩余容量不变
dfs(x + 1, start);
// 情况2:若当前物品体积<=剩余容量,选择该物品并处理下一个
if (arr[x] <= start) {
dfs(x + 1, start - arr[x]);
}
}
signed main() { // 使用signed main因为宏定义了int为long long
// 优化输入输出,减少延迟
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> v >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i]; // 读取每个物品的体积
}
dfs(1, v); // 从第一个物品开始搜索,初始剩余容量为v
// 输出结果
cout << res << endl;
return 0;
}
洛谷P1049 [NOIP 2001 普及组] 装箱问题
于 2025-04-08 23:32:57 首次发布