题目描述

一个旅行者有一个最多能负载m公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分

输入格式

第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30); 第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。

别为C1,C2,...,Cn.若每种物品只有一件求旅行者能获得最大总价值。

输出格式

仅一行,一个数,表示最大总价值。

题解

这是一道动态规划题,首先他让我们求能装下且总价值是最大。

先设一个二维数组a[背包数量i][背包剩余空间j]=背包最大价值。两层循环,1-n和1-m

for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {}
}

第一种情况

接着判断j是否小于w[i],也就是每个物品的重量是否大于j,为什么要是否大于j呢?

因为这是要看背包是否能装下这件物品了,而如果装不下,那么这一个背包和上一个背包的价值是一样的!!当遇到这种情况:就a[i][j](当前背包)=a[i-1][j](上一个背包)

for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {if (j < w[i]) {a[i][j] = a[i - 1][j];  //新增}}
}

第二种情况

如果能装下的话,那么就又分两种情况了:

如果前一个背包的价值要大于前一个背包的价值+当前物品的价值-当前物品的重量的话,那就不值得了,所以这种情况,和上面一样:a[i][j](当前背包)=a[i-1][j](上一个背包)

for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {if (j < w[i]) {a[i][j] = a[i - 1][j];}else {if (a[i - 1][j] > a[i - 1][j - w[i]] + c[i]) {a[i][j] = a[i - 1][j];  //新增}}
}

但是还有另一种情况:

如果前一个背包的价值要小于前一个背包的价值+当前物品的价值-当前物品的重量的话,那肯定值啊!!!

重点(吗?):

不是,也很好理解

就是前一个背包的价值+当前物品的价值-当前物品的重量赋值给当前背包(和上面的判断条件一样)即:

for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {if (j < w[i]) {a[i][j] = a[i - 1][j];}else {if (a[i - 1][j] > a[i - 1][j - w[i]] + c[i]) {a[i][j] = a[i - 1][j];else {a[i][j] = a[i - 1][j - w[i]] + c[i];  //新增}}}
}

怎么样很好理解吧~~~

给出所有代码!!!(主页解释)

#include <bits/stdc++.h>
using namespace std;
int m, n, w[35], c[35], a[1005][1005];
void f__() {int i, j;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (j < w[i]) {a[i][j] = a[i - 1][j];} else {if (a[i - 1][j] > a[i - 1][j - w[i]] + c[i]) {a[i][j] = a[i - 1][j];} else {a[i][j] = a[i - 1][j - w[i]] + c[i];}}}}
}
int main() {cin >> m >> n;for (int i = 1; i <= n; i++) cin >> w[i] >> c[i];f_();cout << a[n][m];return 0;
}

什么?没学过函数?(前面有字)

没学过函数凑什么热闹!!,这不诚心想气我吗这不是?(作为惩罚:必须点赞)

点赞你要亮,关注干得漂亮

不关注点赞你就别走

每天必须日更!!

01背包与完全背包(动态规划)(01背包)相关推荐

  1. c++ 多重背包状态转移方程_Python|动态规划关于0-1背包问题

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云,作者:算法与编程之美 前言 对学算法的同学来说,动态规划是其 ...

  2. 动态规划—0-1背包

    动态规划有以下三个特点: 1:多阶段决策 2:最优值和最优解 3:最优子结构 动态规划采用自底而上的思想保存子问题值,避免重复计算.例如斐波那契数列的递归函数,f(5)=f(3)+f(4),而f(4) ...

  3. c语言动态规划0-1背包,c++实现0-1背包问题完整源码(动态规划实现)

    #include #define MAX_NUM 5 #define MAX_WEIGHT 10 using namespace std; //动态规划求解 int zero_one_pack(int ...

  4. 动态规划——01背包

    动态规划--01背包 1. 经典"01背包" 2. "01背包"方法归纳 3. 实战 3.1 分割等和子集 3.2 最后一块石头的重量 II 3.3 目标和 3 ...

  5. c++ 动态规划-01背包

    动态规划 - 01背包问题 1.使用递归遍历(穷举)求解: 01背包问题:给定 n 种物品和一个重量(容量)(限定条件)为 w 的背包,物品 i 的重量是 wi,其价值为 vi.(每种物品只有一个)问 ...

  6. 动态规划-----------01背包,完全背包与多重背包

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有 ...

  7. 背包九讲系列1——01背包、完全背包、多重背包

    我在进行一些互联网公司的技术笔试的时候,对于我来说最大的难题莫过于最后的那几道编程题了,这对算法和数据结构有一定程度上的要求,而"动态规划"又是编程题中经常出现的算法类型,并且对于 ...

  8. 背包算法(一)-01背包-史上最详细解答

    背包算法(一)-01背包-史上最详细解答 1. 题目 2. 分析 2.1 状态表示 2.2 状态计算 3. 实现 4. 优化 5. 测试 1. 题目 问题描述:有n件物品和容量为m的背包,给出i件物品 ...

  9. c++ 多重背包状态转移方程_动态规划入门——详解经典问题零一背包

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是周三算法与数据结构专题的第12篇文章,动态规划之零一背包问题. 在之前的文章当中,我们一起探讨了二分.贪心.排序和搜索算法,今天我们来 ...

  10. 数据结构与算法学习⑥(动态规划 题解 背包和打家劫舍问题)

    数据结构与算法学习⑥(动态规划 动态规划 1.初识动态规划 1.1.从贪心说起 1.1.1.贪心的特点 1.1.2.贪心的局限性 1.1.3.贪心失效后怎么办 1.1.4.从最优化问题到递归 1.2. ...

最新文章

  1. 万字长文的Redis五种数据结构详解(理论+实战),建议收藏。
  2. manifest文件
  3. day17——其他内置函数
  4. photo常用快捷键
  5. Java:写2个线程,其中一个线程打印1-52,另一个线程打印A-Z,打印顺序应该是12A34B56C...5152Z。
  6. C语言高级编程:结构体中定义数组的“妙用”
  7. 怎么样用 Google Analytics 区分 Google Shopping 页的流量
  8. vue 组件创建与销毁
  9. 《逻辑学导论》思路整理
  10. linux tcp 压力测试工具,技术|分布式TCP压力测试工具 tcpcopy
  11. 实时IP语音通信流程简介
  12. 共享打印机服务器系统64位,win7系统64位和winXP 32位共享网络打印机的操作方法...
  13. ip pim spare 源树 和 共享树_如何实现IP组播,减少摄像头和网络的负载?
  14. 51与JDY31蓝牙模块通讯,51驱动JDY31蓝牙APP点灯
  15. ENVI裁剪影像重叠区域(非矩形)
  16. 公务员面试综合分析真题解析3
  17. Sails.js简介
  18. 关于web前端大作业的HTML网页设计——我的班级网页HTML+CSS+JavaScript
  19. 你怎么看欧阳娜娜空降阿里p8?
  20. docker swarm和docker service

热门文章

  1. 没有了老师,该如何学习?
  2. php中文ascii码范围,标准ascii码字符集共有几个编码?
  3. 国际足联正式裁决莫德斯特闹剧 此事或还有反转?
  4. 塑壳断路器用考虑启动电流么_塑壳断路器和微型断路器的区别
  5. 大工计算机学院博士答辩要求,大连理工大学博士毕业论文要求和发表
  6. C ++程序将给定的英寸转换为等效的码,英尺和英寸
  7. 图形验证码-图片无法加载
  8. python第二课 序列特性
  9. 文件夹总是在新窗口打开
  10. MFC基于对话框上插入MENU菜单栏并点击菜单弹出新窗口