题-Knapsack
2020小米选拔赛2-H题(背包问题)
算法:dp优化。
主要解决的问题:一个背包装下的物品价值和最大。
背包最大承受量m,每个物品都有重量和对应的价值。
怎么装才能使得背包价值最大?
题目链接
反思:课后补题,没做出来,题目做少了。
题意:
多组输入,每组n个物品,m的容量。
求背包价值最大。
思路:测试数据到了1e5级别了,复杂度高,那么就要对动态规划优化
主要算法:常规动态规划,时间复杂度(o(n*m));
for(int i=1;i<=n;i++){for(int j=m;j>=a[i].weight;j--){// 错误代码,每次在添加a[i].value都是独立的,而下面重复。//dp[j-b]=max(dp[j-b],dp[j]+a[i].value);// 多思考思考为什么是这样。dp[j]=max(dp[j],dp[j-a[i].weight]+a[i].value);}
}
如何优化的呢(下面的代码其实是一种不充分的证明,还不够严谨)
dp优化:时间复杂度就在o(500m)之内了。
题解:代码如下
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
int read(){ll s = 0, f = 1; char ch = getchar();while(!isdigit(ch)){if(ch == '-') f = -1;ch = getchar();}while(isdigit(ch)) s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();return s * f;
}struct zw{ll weight;ll value;
}a[200010];
bool cmp(zw x,zw y){return x.value*y.weight>y.value*x.weight;
}
ll dp[200010];
int main (){int n,m;while(cin>>n>>m){for(int i=0;i<=m;i++) dp[i]=0;for(int i=1;i<=n;i++){a[i].weight=read();a[i].value=read();}//对value/weight 的大小排个序。 比值大的放前面。sort(a+1,a+1+n,cmp);//for(int i=1;i<=n;i++)cout<<a[i].value<<" "<<a[i].weight<<endl;ll sum=0;ll index=1;/*使用dp前的优化m>500 其实就是一种不充分的归纳,聚集吧,当然也可写成m>200,但不建议写成m>1000或者大于更大,毕竟while循环主要目的减小m的值,以减小时间复杂度*/while(m>500&&index<=n){m-=a[index].weight;sum+=a[index].value;index++; } ///ÒÉ»óµã¡£ ll ans2=0;for(int i=index;i<=n;i++){for(int j=m;j>=a[i].weight;j--){ //向下递减ll b=a[i].weight;//´错误代码//dp[j-b]=max(dp[j-b],dp[j]+a[i].value); dp[j]=max(dp[j],dp[j-b]+a[i].value);//ans2=max(dp[j],ans2);//没有覆盖,相互独立。}//for(int i=0;i<=m;i++)cout<<dp[i]<<" "; cout<<endl;}cout<<sum+dp[m]<<endl;}
}```
题-Knapsack相关推荐
- 【经典算法题-10】背包问题(Knapsack Problem)
欢迎关注公众号[搞前端的半夏],回复[算法],获取各种算法资料. 说明 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示: ...
- 你面试稳了!通关LeetCode刷题完整攻略,省时又高效
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:穷码农 来源:https://zhuanlan.zhihu.com/p/10 ...
- Knapsack Cryptosystem(2019牛客多校折半查询)
链接:https://ac.nowcoder.com/acm/contest/889/D 来源:牛客网 Amy asks Mr. B problem D. Please help Mr. B to s ...
- Codeforces 刷题记录(已停更)
Codeforces 每日刷题记录 (已停更) 打'+'是一些有启发意义的题目,部分附上一句话题解,每日更新3题,大部分题目较水. Day ID Problem Tutorial Note 1 1 + ...
- 【 FZU - 2214 】Knapsack problem(逆向0-1背包)
题干: Given a set of n items, each with a weight w[i] and a value v[i], determine a way to choose the ...
- 【nyoj - 860】 又见0-1背包 (dp,反向0-1背包,好题好思路)
题干: 又见01背包 时间限制:1000 ms | 内存限制:65535 KB 难度:3 输入 多组测试数据. 每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的 ...
- leetcode刷题规划
LeetCode精华题目列表[刷题规划系列] – TuringPlanet 目录 算法题到底在考察什么? 题目列表 Array String Linked List Queue Stack Advan ...
- codeforces 有意思的思维题 1 ~ 15
codeforces 思维题 1.给定数组,求满足i < j and ai * aj = i + j的数对数量 2.第 i 步向前跳 i 步或后退 1 步 3.给两个点,求正方形的另两个点 4. ...
- 西电算法分析与设计核心考点汇总(期末真题,教材算法导论)
文章目录 前言 一.历年考题 1.1 判断题 1.2 单选题 1.3 复杂度计算 1.4 分治 1.5 算法设计(01背包,最短路径) 1.6 最大子数组问题 1.7 算法设计(最长回文串) 二.核心 ...
最新文章
- jsp的session介绍 (转)
- 分享Kali Linux 2016.2第49周虚拟机
- 人工智能免费公开课一网打尽!14个类别、230门课程,GitHub标星6000+
- JavaScript流程控制之分支结构
- “7th-place-solution-microsoft-malware-prediction”——kaggle微软恶意代码检测比赛第七名代码
- 安卓车机root改流浪地球_教你王者荣耀改战区
- 如何在5分钟内通过身份验证构建RESTful API —全部从命令行(第1部分)
- mac版小达人点读包怎么安装_小达人点读笔扩容实战:16G变128G
- 作者:冷芳玲(1978-),女,博士,东北大学计算机科学系讲师
- linux目录自动同步,Linux下rsync+inotify实现实时文件自动同步
- 冒着得罪大佬的风险,曝光下这件事
- 大数据分析软件具备哪些功能特点
- Python语音转文字、音频切割、语音识别
- FIT2CLOUD飞致云荣膺“2021年度OSCHINA优秀开源技术团队”奖项
- ISO 27001,能给企业带来哪些好处?
- 硬盘IDE和AHCI模式的区别
- 怎么让电脑微信安装到别的盘路径
- Cisco wlan controlller配置
- 戴尔电脑能升级鸿蒙系统嘛,戴尔台式机预装win10家庭版升级win10专业版方法教程...
- 关于cookie的详细讲解