NOIP 装箱问题

简介: NOIP 装箱问题

题目:[NOIP2001]装箱问题 ,哈哈,我们今天来看一道很古老的题嘛,这是选自NOIP上的一道题,好了,我们一起来看看题意吧:

考虑到直接复制题目,或者截屏的方式不是很方便阅读,我就把直接题目链接放下面!

题目传送门: [NOIP2001]装箱问题

思路:

写过01背包的老板看到这道题时,嘴角微微上扬,说,这还不简单,分分钟AC😎

但是,我这里用另一种动态规划的思路

先说说为什么要用动态规划吧:如果用暴力法的话(枚举每个物品装箱还是不装箱),时间复杂度会很高 O(2^n) 😗, 我们需要降低时间复杂度。

举个例子:背包容量 20, 5个物品,体积分别为,1,2,2,4,5 ,若我们枚举每个物品放不放的话,时间复杂度是 2^5 ,我们思考下,可以发现我们放两个体积为2的物品和放一个体积为4的物品,对结果是没有影响的。 我们算出这些物品可以放出的体积有: 1,2,3,4,5,6,7,8,9,10,11,12,13,14 这里一共14次(不排除算错的可能哈😂),而暴力法的话,有32种情况。

我们采用动态规划的思想呢,时间复杂度为:物品个数*背包体积

我们来看看成功AC的代码吧:

二维数组版

#include<bits/stdc++.h>
using namespace std;
int n,total;
int v[20010];
int f[35][20010];
int main(){
    f[0][0]=1;
    cin>>total>>n;
    for(int i=1;i<=n;i++) cin>>v[i];
    /**
     * f[i][j] 表示 0到i 的物品能否填满容量为 j 的背包
     */
     for(int i=1;i<=n;i++){
         for(int j=0;j<=total;j++){
             // f[i-1][j] 就表示前面 i-1 件物品能否填满容量为j的背包
             // f[i-1][j-v[i]] 表示前面 i-1 件物品能否填满容量为j-v[i]的背包
             if(j>=v[i]) f[i][j]=f[i-1][j]||f[i-1][j-v[i]];
             else f[i][j]=f[i-1][j];
         }
     }
     int ans=0;
     for(int i=total;i>=0;i--){
         if(f[n][i]==1){
             ans = i;break;
         }
     }
     cout<<total-ans;
    return 0;
}

我这里放一张雨巨的图,便于大家理解

我们可以看到每一行的结果实际上只与上一行有关,所以啊,我们可以压缩一下

压缩时有个坑:我们遍历体积的时候,需要从大到小去遍历,这样是为了防止让一个物品多次放入背包(这波操作真的很有意思😜)

下面我直接放代码

一维数组版

#include<bits/stdc++.h>
using namespace std;
int n,total;
int v[20010];
int f[20010];
int main(){
    f[0]=1;
    cin>>total>>n;
    for(int i=1;i<=n;i++) cin>>v[i];
    for(int i=1;i<=n;i++){
         for(int j=total;j>=v[i];j--){
             f[j]=f[j]||f[j-v[i]];
         }
     }
     int ans=0;
     for(int i=total;i>=0;i--){
         if(f[i]==1){
             ans = i;break;
         }
     }
     cout<<total-ans;
    return 0;
}


目录
打赏
0
0
0
0
0
分享
相关文章
|
10月前
每日练习之数学——砝码和天平
每日练习之数学——砝码和天平
58 3
老程序员分享:NOIP2016天天爱跑步(树上差分)
老程序员分享:NOIP2016天天爱跑步(树上差分)
58 0
|
11月前
装箱问题(背包问题)
装箱问题(背包问题)
91 0
【动态规划】守望者的逃离
【动态规划】守望者的逃离
131 0
蓝桥杯(聪明的猴子)克鲁斯卡尔算法最小生成树
蓝桥杯(聪明的猴子)克鲁斯卡尔算法最小生成树
134 0
【蓝桥杯集训·每日一题】AcWing 3305. 作物杂交
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 Spfa算法
144 0
【蓝桥杯集训·每日一题】AcWing 4074. 铁路与公路
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 Floyd 算法 Spfa 算法
125 0
凸多边形航线规划算法优化
凸多边形航线规划算法优化
367 0
凸多边形航线规划算法优化
算法系统学习-在吗?百钱买百鸡呗?(蛮力法)
该系列是基于有一定语言基础(C,C++,Java等等)和基本的数据结构基础进行的算法学习专栏,如果觉得有点吃力 😥 ,建议先了解前提知识再学习喔!本个专栏会将用更容易理解的表达去学习算法,如果在一些表述上存在问题还请各位多多指点
190 0
洛谷【6】P1047 [NOIP2005 普及组] 校门外的树
洛谷【6】P1047 [NOIP2005 普及组] 校门外的树

相关实验场景

更多