zoukankan      html  css  js  c++  java
  • 01背包之---------装箱问题

    在上一次的讲解,我们明白了什么是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
    ", w - d[w]);//注意是输出w-d[w];

    好了这道题就结束了

    很基础的板子题

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

  • 相关阅读:
    Chino 操作系统开发日志 (1)
    将Asp.Net Core和corefx移植到.Net 4.0
    C++编写操作系统(1):基于 EFI 的 Bootloader
    第二次作业:支付宝手机软件分析
    第一次作业:以人为鉴 可以明得失
    个人附加作业
    个人作业3---个人总结
    结对编程2---单元测试
    个人作业2---必应词典案例分析
    结对编程作业1
  • 原文地址:https://www.cnblogs.com/kevin6666/p/10937875.html
Copyright © 2011-2022 走看看