原博客:0-1背包问题

0-1背包问题

描述:

一个背包容量为c ,现有n件物品,求能装入背包的最大重量是多少?

输入:

先输入两个正整数n、c(0<n、c<1000),表示物品的件数和背包容量,再输入n个正整数,分别是这n件物品的重量。

输出:

输出能装入背包的最大重量。

输入样例:

5 5023 18 13 35 24

输出样例:

48

思路

方法一:

0-1背包的裸题,那就可以直接写一个01背包的动态转移方程:dp[j]=max(dp[j],dp[j-w[i]]+p[i])。dp[j]的意思是:当背包已装j的重量的物品时的最大价值。那么它可以由背包已装j-w[i]时最大的价值进行转移,即由dp[j-w[i]]+p[i]得到。注意每一次要将dp[]设置为0,因为背包此时无价值。当状态方程枚举结束后,我们再从 dp[]数组中找一遍,求得答案maxx=max{dp[i]}(i from 0 to c),输出答案maxx。这种动态规划的方法的时间复杂度为O(n^2).

ps:0-1背包也可以写成二维dp[][],只是这样写成滚动数组可以更加节省空间。

方法二:

除了直接写0-1背包的动态转移方程,还可以直接写dfs,每一个背包无非就是取和不取两个状态,如果要取则要求背包容量 res>=w[now]。分别用ans1,ans2表示取当前物品,不取当前物品的最大价值,dfs返回max(ans1,ans2),dfs的终止条件是now ==n+1。时间复杂度(2^n)。

ps:方法二相较于方法一思维上更加简单,容易想到,但是代码就相对麻烦,并且时间复杂度不够优秀,当然如果加上记忆化搜索后时间复杂度和动态规划是相当的。我个人更喜欢方法一。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=    2000+50;
int n,c,w[maxn],dp[maxn],p[maxn];
int main(){int i,j;scanf("%d%d",&n,&c);for(i=1;i<=n;i++)cin>>w[i],p[i]=w[i];for(i=1;i<=n;i++){for(j=c;j>=1;j--){if(j-w[i]>=0&&dp[j]<dp[j-w[i]]+p[i]){dp[j]=dp[j-w[i]]+p[i];}}}int maxx=0;for(i=0;i<=c;i++)if(maxx<dp[i])maxx=dp[i];cout<<maxx<<endl;return 0;
}
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=    2000+50;
int n,c,w[maxn],p[maxn];
int dfs(int now,int res){if(now==n+1)return 0;int ans1=0,ans2=0;if(res>=w[now]){ans1=dfs(now+1,res-w[now])+p[now];}ans2=dfs(now+1,res);if(ans1>=ans2)return ans1;return ans2;
}
int main(){int i,j;scanf("%d%d",&n,&c);for(i=1;i<=n;i++)cin>>w[i],p[i]=w[i];cout<<dfs(1,c)<<endl;return 0;
}

NOJ-1577-0-1背包问题相关推荐

  1. 0/1背包问题——动态规划方法

    1.定义 动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解. 2.求解步骤 (1)找到状态转化条件 (2)归纳状态转移方程 (3)定义初始条件值 3.实例解析--0/1背包 ...

  2. 0/1背包问题-----回溯法求解

    问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...

  3. 0/1背包问题-----动态规划求解

    问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...

  4. 【动态规划】0/1背包问题

    问题 H: [动态规划]0/1背包问题 时间限制: 1 Sec  内存限制: 64 MB 提交: 152  解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭 ...

  5. 分枝定界法解0/1背包问题

    分枝定界法解0/1背包问题 关键词:分支定界.0-1背包 分枝定界法简介 分枝定界法按照树形结构来组织解空间,展开节点后,有两种策略: 策略一.把节点加入 FIFO 队列当中: 策略二.把节点加入到堆 ...

  6. 回溯法 —— 求解0/1背包问题(剪枝)

    0/1背包问题 题目描述: 有n个重量分别为w1,w2,-,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,-,vn,给定一个容量为W的背包.设计从这些物品中选取一部分物品放入该背包的方案 ...

  7. 令人头疼的背包九讲(1)0/1背包问题

    点击上方"Jerry的算法和NLP",选择"星标"公众号       重磅干货,第一时间送达 背包问题是一个经典的动态规划模型.它既简单形象容易理解,又在某种程 ...

  8. 多米诺骨牌——变形版0,1背包问题

    多米诺骨牌--变形版0,1背包问题 1.题目描述 2.问题分析 3.算法源码 1.题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的上方块中点数之和记为S1,下方块中点数之和 ...

  9. 0/1背包问题(蛮力法)

    问题描述: 给定n个重量为{w1,w2,w3,....,wn}.价值为{v1,v2,v3,...,vn}的物品和一个容量为C的背包,0/1背包问题是求解这些物品中的一个最有价值的子集,并且要能够装到背 ...

  10. 分枝限界法求解0/1背包问题

    问题描述 有n个重量分别为{w1,w2,-,wn}的物品,它们的价值分别为{v1,v2,-,vn},给定一个容量为W的背包. 设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中 ...

最新文章

  1. xgboost回归预测模型_偏最小二乘回归分析法 从预测角度对所建立的回归模型进行比较...
  2. Spring MVC常用注解说明
  3. 3G突破必须打破漫游费的限制
  4. 如何用python画一朵玫瑰花-使用Python画一朵美丽的玫瑰花
  5. 【树莓派自动化应用实例】整点提醒自己休息五分钟
  6. Java web 开发的概念、环境配置、创建项目过程详解(Eclipse)
  7. Redis如何淘汰过期的keys
  8. Oracle访问同义词连接超时,利用同义词解决oracle用户访问其它schema的对象
  9. Ubuntu18.04之搜狗输入法
  10. 通过css使文字有渐变的效果
  11. excel中使用Nist REFPROP常用函数及使用方法
  12. Github - 第一篇:Github安装与配置
  13. viper12a电源电路图_采用VIPer12A的开关电源电路分析(图)
  14. Struts2 通配符不能使用问题
  15. spring aop切面执行顺序
  16. 计算机操作系统(一)——计算机操作系统的概念
  17. 半导体上下游最核心供应商名单(建议收藏)
  18. 洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall(二分图最大匹配)
  19. 饥荒联机云服务器_饥荒(Don't Starve Together)腾讯云服务器搭建(unbuntu篇)
  20. v-if,v-else-if, v-else的实际使用

热门文章

  1. 人工智能数学基础——假设检验
  2. 使用Webupload实现异步上传图片
  3. 东京大学工学系研究科数学套路总结系列之一【常微分方程式所有解法总结】
  4. 学习java的第12天
  5. 常见无线定位技术的基本原理
  6. 增量模型(incremental model) 设计核心功能+逐步累加
  7. Adobe Audition (AU)安装教程(附Adobe Audition下载地址)
  8. 2017全球十大云计算平台市场占有率排行榜
  9. 【QT开发专题-天气预报】14. 请求天气数据
  10. i10在java中什么意思啊,java题库_JAVA题库的题 求答案啊!!!!!!!!!!!!!!!!_淘题吧...