算法学习之路|蒜头君的购物袋1

简介: 蒜头君去超市购物,他有一只容量为 V 的购物袋,同时他买了 n件物品,已知每件物品的体积 vi。蒜头君想知道,挑选哪些物品放入购物袋中,可以使袋子剩余的空间最小。

蒜头君去超市购物,他有一只容量为 V 的购物袋,同时他买了 n件物品,已知每件物品的体积 vi。蒜头君想知道,挑选哪些物品放入购物袋中,可以使袋子剩余的空间最小。

输入格式
第一行输入一个整数 V(1≤V≤20,000),表示购物袋的容量。

第二行输入一个整数 n(1≤n≤30),表示蒜头君购买的 n 件物品。

接下来输入 n 行,每行输入一个整数 vi(1≤vi​≤10,000),表示第 i 件物品的体积。

输出格式
输出一行,输出一个整数,表示购物袋最小的剩余空间。

样例输入
20
5
7
5
7
3
7
样例输出
1

解题思路

本题与普通动态规划有些不同,多了一个袋子的范围v。

因此我们可以根据袋子的体积和物体的编号来确定状态。

于是我们使dpi代表在第1~i编号中j容量的袋子可放下最大物品体积。

我们把问题分层,第i号物体放,还是不放。(令shop[i]为第i个物体的体积)

当j

当j>=shop[i]时,可以放,也可以不放。

                    可以:dp[i][j]=dp[i-1][j-shop[i]]+shop[i]//放进去了,袋子所剩的容量能在1~i-1中选择其最大的物体 

                    不放:dp[i][j]=dp[i-1][j]

                    则dp[i][j]=max(dp[i-1][j-shop[i]]+shop[I],dp[i-1][j])  //选择较大的

最好下标从1开始,初始dpall={0},这样,初始值就无需设置了。

#include<iostream>
#include<algorithm>
using namespace std;
int dp[31][20001];//全局变量,默认都是0
int main(){
    int v,n;
    cin>>v>>n;
    int shop[31];
    for(int i=1;i<=n;i++)   cin>>shop[i];//录入物体体积
    
    
    for(int i=1;i<=n;i++){
        for(int j=1;j<=v;j++){
            if(shop[i]>j)
                dp[i][j]=dp[i-1][j];
            else
                dp[i][j]=max(dp[i-1][j-shop[i]]+shop[i],dp[i-1][j]);
        }
    }
    cout<<v-dp[n][v];//输出最后所剩下的体积
}
目录
相关文章
|
1天前
|
机器学习/深度学习 算法 前端开发
Scikit-learn进阶:探索集成学习算法
【4月更文挑战第17天】本文介绍了Scikit-learn中的集成学习算法,包括Bagging(如RandomForest)、Boosting(AdaBoost、GradientBoosting)和Stacking。通过结合多个学习器,集成学习能提高模型性能,减少偏差和方差。文中展示了如何使用Scikit-learn实现这些算法,并提供示例代码,帮助读者理解和应用集成学习提升模型预测准确性。
|
2天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
11 0
|
30天前
|
Rust Dart 算法
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!
|
1月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
|
1月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Canny边缘检测算法
Opencv(C++)学习系列---Canny边缘检测算法
|
1月前
|
算法 Java 索引
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
31 0
|
1月前
|
存储 算法 Java
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
44 0
|
1月前
|
机器学习/深度学习 算法 生物认证
基于深度学习的人员指纹身份识别算法matlab仿真
基于深度学习的人员指纹身份识别算法matlab仿真
|
25天前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的视频手部检测算法matlab仿真
基于yolov2深度学习网络的视频手部检测算法matlab仿真