当前位置: 首页 > news >正文

蓝桥杯 小明的背包1 小兰的神秘礼物 01背包问题 模板 C++

01背包问题

问题描述

n件物品,一个容量是m的背包。每件物品只能使用一次。
第i个物品的体积是w[i],价值是v[i]。
求解将哪些物品装入背包,可使总体积不超过背包容量,且总价值最大。

算法思路

共有两种求解方法(二维数组和一维数组),推荐选择一维数组。 

1、二维数组

for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(j<w[i])//装不下第i个物品,价值与第i-1个物品相等 
            {
                f[i][j]=f[i-1][j];
            }else{//如果能装下,进行抉择是否选择第i个物品 
                f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
            }
        }
    }
    cout<<f[n][m];

2、一维数组(推荐)

for(int i=1;i<=n;i++)
    {
        int w,v;
        cin>>w>>v;
        for(int j=m;j>=w;j--)
        {
            f[j]=max(f[j],f[j-w]+v);
        }
    }
    cout<<f[m];

实战1-小明的背包1

题目描述

小明有一个容量为 V 的背包。
这天他去商场购物,商场一共有 N 件物品,第i件物品的体积为wi,价值为 vi。
小明想知道在购买的物品总体积不超过 V 的情况下所能获得的最大价值为多少,请你帮他算算。

输入描述

输入第 1行包含两个正整数 N,V,表示商场物品的数量和小明的背包容量。
第2~N+1行包含 2 个正整数 w,v,表示物品的体积和价值。
1 ≤ N≤ 102, 1≤ V ≤ 103, 1 ≤ wi, vi ≤ 103

输出描述

输出一行整数表示小明所能获得的最大价值。

输入输出样例

示例 1

输入

5 20

1 6

2 5

3 8

5 15

3 3

输出

37 

完整代码

1、二维数组

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int f[N][N];
int w[N],v[N];
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>w[i]>>v[i];}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(j<w[i]){f[i][j]=f[i-1][j];}else{f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);}}}cout<<f[n][m];return 0;
}

 2、一维数组

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int f[N];
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++){int w,v;cin>>w>>v;for(int j=m;j>=w;j--){f[j]=max(f[j],f[j-w]+v);}}cout<<f[m];return 0;
}

实战2-小兰的神秘礼物

问题描述

小兰要过生日了,好朋友妮妮想送她一个特别的礼物。妮妮找来了一个神秘的箱子,箱子的容量为 V。她还收集了 n 个有趣的小物件,每个物件都有一个体积 。
妮妮想把这些小物件中的一部分装进箱子里,当然也可以一个都不装。但是,为了增加神秘感,她希望箱子装得尽可能满,剩余的空间最小。你能帮妮妮计划一下,让她知道箱子最终的最小剩余空间吗?

输入格式

第一行共一个整数 V,表示箱子的容量。
第二行共一个整数 n,表示收集的小物件总数。
接下来的 几 行,每行包含一个正整数 ~,表示第之个小物件的体积。

数据范围保证:0<n<1000,1<x,V<1000.

输出格式

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

样例输入

300

3

120

260

190

样例输出 

40

完整代码

1、二维数组

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int f[N][N];
int w[N];
int main()
{int n,m;cin>>m>>n;for(int i=1;i<=n;i++){cin>>w[i];}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(j<w[i]){f[i][j]=f[i-1][j];}else{f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+w[i]);//将体积当做价值 }}}cout<<m-f[n][m];return 0;
}

 2、一维数组

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int f[N];
int main()
{int m;cin>>m;int n;cin>>n;for(int i=1;i<=n;i++){int w;cin>>w;for(int j=m;j>=w;j--){f[j]=max(f[j],f[j-w]+w);//将体积当做价值 }}cout<<m-f[m];return 0;
}


http://www.mrgr.cn/news/97145.html

相关文章:

  • [GN] Python3基本数据类型 -- 与C的差异
  • 7.训练篇5-毕设
  • Koordinator-NodeInfoCollector
  • 优选算法的妙思之流:分治——快排专题
  • Leetcode 169 -- 分治 | 摩尔投票法
  • Tradingview 策略分享 - SSL 混合和 CE 交易策略
  • MySQL学习笔记(一)——MySQL下载安装配置
  • C语言:数据的存储
  • 01背包问题:详细解释为什么重量维度必须从大到小遍历。
  • 消息队列之-Kafka
  • AI 数理逻辑基础之统计学基本原理(上)
  • Leetcode 127 -- 哈希表
  • 【嵌入式-stm32电位器控制以及旋转编码器控制LED亮暗】
  • WSL使用经验
  • 第三季:挪威
  • RocketMQ 中的 ProducerManager 组件剖析
  • Leetcode 857 -- 贪心 | 数学
  • OrangePi5Plus开发板不能正确识别USB 3.0 设备 (绿联HUB和Camera)
  • 指令补充+样式绑定+计算属性+监听器
  • 在 Android Studio 中运行安卓应用到 MuMu 模拟器