简述一下01背包:

背包容量大小固定,有一些物品,每个物品都有重量和价值两个属性,且物品唯一不重复(即同一物品只能放入一个),放入物品的总重量不能超过背包容量 ,求放入背包的物品的总价值最大化。0代表不放入,1代表放入。

可以通过建表的方式实现01背包,非递归实现。

如果用c[i]表示 i 号物品的重量,v[i]表示 i 号物品的价值,函数f(i,j)表示在有0,1,2...i 号物品和重量限制 j 时能够得到的最大价值,表result[i][j]=f(i,j)

那么可以f(i,j)=max((result[i - 1][j - c[i]] + v[i]),(result[i - 1][j]))查表非递归。

考虑如下:

有一个物品,我们需要考虑该不该把他放入背包中,无非放入和不放入两种情况,那么我们只需要把两种情况下的总价值都算出来,然后取较大的一个就可以了。

result[i - 1][j - c[i]] + v[i]:放入的情况

总价值为 有 i-1 个物品且重量上限为当前上限 j 减去 i 号物品的重量时的价值 result[i - 1][j - c[i]] 加上 i 号物品的价值 v[i]

result[i - 1][j]:不放入的情况,总价值和 i-1 个物品时一样(当前考虑的物品是 i 号物品)

代码部分:

#include<iostream>
#include<string>
using namespace std;
int c[]; //重量
int v[]; //价值
int result[][]; //表 ///f()函数,计算在i+1个物品和重量上限j的条件下的最大背包价值 int f(int i,int j) //第i个物品,重量上限j //0号物品即第一个物品
{
if (i == &&c[i]<=j) //0号物品且重量小于上限
{
return v[i]; //把0号物品放入背包,背包价值为第0号物品的价值
}
if (i == && c[i] > j) //0号物品且重量大于上限
{
return ; //物品放不进背包,此时背包为空,背包价值为0
} //不是0号物品的情况
if (i != && j-c[i] >= ) //i号物品可以放入背包
{
//判断放入和不放入两种情况下背包的价值,选择价值大的方案
return (result[i - ][j - c[i]] + v[i]) > result[i - ][j] ? (result[i - ][j - c[i]] + v[i]) : result[i - ][j];
} //把这个物品放入背包 //不放入背包
else //i号物品不可以放入背包
return result[i - ][j];
} int getResult(int top, int num)
{
if (num == ) //有0个物品
return ; else
{ for (int i = ; i < num; i++) //第i个物品
{
for (int j = ; j <= top; j++) //重量
{
result[i][j] = f(i,j); //建表,result[i][j]表示有0,1,2...i个物品和j的重量限制下的最大背包价值
}
}
return result[num-][top];
}
} int main()
{
int top; //背包容量
int num; //物品数量
cout << "输入格式:上限,数量,每个物品的重量和价值。" << endl;
cin >> top;
cin >> num;
for (int i = ; i < num; i++) //第i个物品的重量和价值
{
cin >> c[i] >> v[i];
}
cout << getResult(top, num) << endl;
return ;
}

测试样例1:

测试样例2:

测试样例3:

C++ 实现01背包动态规划的更多相关文章

  1. HihoCoder - 1038 01背包 动态规划

    #1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...

  2. Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)

    传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...

  3. [C++] 动态规划之矩阵连乘、最长公共子序列、最大子段和、最长单调递增子序列、0-1背包

    一.动态规划的基本思想 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解. 将待求解问题分解成若干个子问题,先求解子 ...

  4. 动态规划——背包问题python实现(01背包、完全背包、多重背包)

    目录 01背包问题 完全背包问题 多重背包问题 参考: 背包九讲--哔哩哔哩 背包九讲 01背包问题 01背包问题 描述: 有N件物品和一个容量为V的背包. 第i件物品的体积是vi,价值是wi. 求解 ...

  5. 动态规划_01背包_从Dijikstra和Floyd入手,彻底理解01背包

    dp一直是短板,现在从最基础的地方开始补 给定背包总容量 M ,n个商品选择,分别有价值vi,占量wi,从中取商品放入背包,令.容量和W=Σwi不超过M,令背包中的价值和V=Σvi最大 然后取法有很多 ...

  6. 0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

    一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i ...

  7. 【洛谷】【动态规划/01背包】P2925 [USACO08DEC]干草出售Hay For Sale

    [题目描述:] 约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包干草,每一包都有它 ...

  8. 【洛谷】【动态规划/01背包】P1734 最大约数和

    [题目描述:] 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. [输入格式:] 输入一个正整数S. [输出格式:] 输出最大的约数之和. [算法分析:] 01背包,每个数 ...

  9. P1060 开心的金明(洛谷,动态规划递推,01背包轻微变形题)

    题目链接:P1060 开心的金明 基本思路: 基本上和01背包原题一样,不同点在于这里要的是最大重要度*价格总和,我们之前原题是 f[j]=max(f[j],f[j-v[i]]+p[i]); 那么这里 ...

随机推荐

  1. TOAD Menu Shortcuts 快捷键

    TOAD Menu Shortcuts Category Command Shortcut Conflict File AWR Browser File Compare Files File DBMS ...

  2. hive中sql解析出对应表和字段的调查

    ---恢复内容开始--- .阿里的druid中的sql parser有各种关系数据库sql的解析,但hive的不支持. druid初期的版本中是包含hive的,将以前版本中的hive dialect对 ...

  3. NIO的学习

    参考 http://wenku.baidu.com/link?url=rq-BEp3Et4JRrE62f2Lv9hq8nT_Gq0XPb65h8OBqTAt-ILfqKmdjIhVEp8bctIdm0 ...

  4. 关键字instanceof和final

    Instanceof关键字(类似oc的isKindOfClass 和 isMemberOfClass) instanceof(实例类型) 关键字作用: 1.判断某一个对象是否属于某一个类 2.inst ...

  5. Maven浅析-3 Ant Vs Maven

    1.什么是Ant? Ant起源是为了取代构建工具Make.它可以跨系统,建立在Java和XML的基础上,而且非常程式化. Ant更像一个脚本工具,我们必须在Ant内显示地声明做任何事情.在<ta ...

  6. IO 流—>>>补充

    流操作规律: 示例:1. 源: 键盘录入 目的: 控制台 2.源:文件 目的:控制台 3.源: 键盘录入 目的: 文件 基本规律: 面对流对象很多,不知道用哪一个的时候: 通过两个明确来完成 1.明确 ...

  7. Servlet(2)

    一.伪代码演示Tomcat的内部代码运行 1).通过映射找到servlet-class的内容,字符串:com.gqx.servlet.FirstServlet 2).通过反射构造构造FirstServ ...

  8. 20169210《Linux内核原理与分析》第六周作业

    这次博客分为两部分,第一部分是实验,第二部分是教材. 第一部分:实验 这周实验的内容是使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,教学案例给的是time()获取系统时间的函数,我 ...

  9. 在VS Nuget命令行下进行EF数据库迁移

    找到项目中,用到数据库DLL的地方,然后选中该项目,打开Nuget命令行输入以下的命令: 其中cardId为迁移名称,自己取

  10. asp.net采用OLEDB方式导入Excel数据时提示:未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0" 提供程序"

    笔者在项目中做做了一个从Excel表格中导入数据的模块.大体上asp.net项目中导入Excel大体分成三类: 1)采用c#内置方案System.Data.OleDb(限制较小, 通用) 2)采用Ex ...