洛谷P1049 [NOIP 2001 普及组] 装箱问题

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值