01背包之---------装箱问题

博客承接上次对01背包的讲解,此次给出一道名为“装箱问题”的基础01背包题,包含题目描述、输入输出等信息,还展示了代码核心部分的枚举过程,最后表示下一节继续讲01背包练习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一次的讲解,我们明白了什么是01背包,这次来看题

先看一道水题

1350: 装箱问题

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 835  Solved: 455

Description

有一个箱子容量为v(正整数,0≤v≤20000),同时有n个物品(0<n≤30),每个物品有一个体积(正整数)。
要求从m个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。

Input

第一行,一个整数v,表示箱子容量;
第二行,一个整数,表示有n个物品;
接下来n行,每行一个数,分别表示这n个物品的各自体积。

Output

输出一行,一个整数,表示箱子剩余空间。

Sample Input

24
6
8
3
12
7
9
7

Sample Output

0,
解释一下样例
他要先输入一个
v表示总体积
n表示总个数
   int w;
    scanf("%d%d", &w, &n);
    int i, j;
    for (i = 0; i < n; i++){
        scanf("%d", &a[i]);//输入
 
    }

 


让你用这n个数,尽量去凑v,这就用到了01背包的思想,枚举,一个个的试嘛
可以先用sort排个序(一般不用),在用memset
    memset(d, 0, sizeof(d));

然后就是代码的核心部分

开始枚举

  for (i = 0; i < n; i++){
        for (j = w; j >= a[i]; j--)
 
            d[j] = max(d[j], d[j - a[i]] + a[i]);//上节讲的最基本的公式
 
    }
    printf("%d\n", w - d[w]);//注意是输出w-d[w];

好了这道题就结束了

很基础的板子题

下一节继续讲01背包的练习

转载于:https://www.cnblogs.com/kevin6666/p/10937875.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值