NOJ-1577-0-1背包问题
原博客: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背包问题相关推荐
- 0/1背包问题——动态规划方法
1.定义 动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解. 2.求解步骤 (1)找到状态转化条件 (2)归纳状态转移方程 (3)定义初始条件值 3.实例解析--0/1背包 ...
- 0/1背包问题-----回溯法求解
问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...
- 0/1背包问题-----动态规划求解
问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...
- 【动态规划】0/1背包问题
问题 H: [动态规划]0/1背包问题 时间限制: 1 Sec 内存限制: 64 MB 提交: 152 解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭 ...
- 分枝定界法解0/1背包问题
分枝定界法解0/1背包问题 关键词:分支定界.0-1背包 分枝定界法简介 分枝定界法按照树形结构来组织解空间,展开节点后,有两种策略: 策略一.把节点加入 FIFO 队列当中: 策略二.把节点加入到堆 ...
- 回溯法 —— 求解0/1背包问题(剪枝)
0/1背包问题 题目描述: 有n个重量分别为w1,w2,-,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,-,vn,给定一个容量为W的背包.设计从这些物品中选取一部分物品放入该背包的方案 ...
- 令人头疼的背包九讲(1)0/1背包问题
点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 背包问题是一个经典的动态规划模型.它既简单形象容易理解,又在某种程 ...
- 多米诺骨牌——变形版0,1背包问题
多米诺骨牌--变形版0,1背包问题 1.题目描述 2.问题分析 3.算法源码 1.题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的上方块中点数之和记为S1,下方块中点数之和 ...
- 0/1背包问题(蛮力法)
问题描述: 给定n个重量为{w1,w2,w3,....,wn}.价值为{v1,v2,v3,...,vn}的物品和一个容量为C的背包,0/1背包问题是求解这些物品中的一个最有价值的子集,并且要能够装到背 ...
- 分枝限界法求解0/1背包问题
问题描述 有n个重量分别为{w1,w2,-,wn}的物品,它们的价值分别为{v1,v2,-,vn},给定一个容量为W的背包. 设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中 ...
最新文章
- xgboost回归预测模型_偏最小二乘回归分析法 从预测角度对所建立的回归模型进行比较...
- Spring MVC常用注解说明
- 3G突破必须打破漫游费的限制
- 如何用python画一朵玫瑰花-使用Python画一朵美丽的玫瑰花
- 【树莓派自动化应用实例】整点提醒自己休息五分钟
- Java web 开发的概念、环境配置、创建项目过程详解(Eclipse)
- Redis如何淘汰过期的keys
- Oracle访问同义词连接超时,利用同义词解决oracle用户访问其它schema的对象
- Ubuntu18.04之搜狗输入法
- 通过css使文字有渐变的效果
- excel中使用Nist REFPROP常用函数及使用方法
- Github - 第一篇:Github安装与配置
- viper12a电源电路图_采用VIPer12A的开关电源电路分析(图)
- Struts2 通配符不能使用问题
- spring aop切面执行顺序
- 计算机操作系统(一)——计算机操作系统的概念
- 半导体上下游最核心供应商名单(建议收藏)
- 洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall(二分图最大匹配)
- 饥荒联机云服务器_饥荒(Don't Starve Together)腾讯云服务器搭建(unbuntu篇)
- v-if,v-else-if, v-else的实际使用
热门文章
- 人工智能数学基础——假设检验
- 使用Webupload实现异步上传图片
- 东京大学工学系研究科数学套路总结系列之一【常微分方程式所有解法总结】
- 学习java的第12天
- 常见无线定位技术的基本原理
- 增量模型(incremental model) 设计核心功能+逐步累加
- Adobe Audition (AU)安装教程(附Adobe Audition下载地址)
- 2017全球十大云计算平台市场占有率排行榜
- 【QT开发专题-天气预报】14. 请求天气数据
- i10在java中什么意思啊,java题库_JAVA题库的题 求答案啊!!!!!!!!!!!!!!!!_淘题吧...