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相关推荐

  1. 【经典算法题-10】背包问题(Knapsack Problem)

    欢迎关注公众号[搞前端的半夏],回复[算法],获取各种算法资料. 说明 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示: ...

  2. 你面试稳了!通关LeetCode刷题完整攻略,省时又高效

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:穷码农 来源:https://zhuanlan.zhihu.com/p/10 ...

  3. Knapsack Cryptosystem(2019牛客多校折半查询)

    链接:https://ac.nowcoder.com/acm/contest/889/D 来源:牛客网 Amy asks Mr. B problem D. Please help Mr. B to s ...

  4. Codeforces 刷题记录(已停更)

    Codeforces 每日刷题记录 (已停更) 打'+'是一些有启发意义的题目,部分附上一句话题解,每日更新3题,大部分题目较水. Day ID Problem Tutorial Note 1 1 + ...

  5. 【 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 ...

  6. 【nyoj - 860】 又见0-1背包 (dp,反向0-1背包,好题好思路)

    题干: 又见01背包 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 输入 多组测试数据. 每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的 ...

  7. leetcode刷题规划

    LeetCode精华题目列表[刷题规划系列] – TuringPlanet 目录 算法题到底在考察什么? 题目列表 Array String Linked List Queue Stack Advan ...

  8. codeforces 有意思的思维题 1 ~ 15

    codeforces 思维题 1.给定数组,求满足i < j and ai * aj = i + j的数对数量 2.第 i 步向前跳 i 步或后退 1 步 3.给两个点,求正方形的另两个点 4. ...

  9. 西电算法分析与设计核心考点汇总(期末真题,教材算法导论)

    文章目录 前言 一.历年考题 1.1 判断题 1.2 单选题 1.3 复杂度计算 1.4 分治 1.5 算法设计(01背包,最短路径) 1.6 最大子数组问题 1.7 算法设计(最长回文串) 二.核心 ...

最新文章

  1. jsp的session介绍 (转)
  2. 分享Kali Linux 2016.2第49周虚拟机
  3. 人工智能免费公开课一网打尽!14个类别、230门课程,GitHub标星6000+
  4. JavaScript流程控制之分支结构
  5. “7th-place-solution-microsoft-malware-prediction”——kaggle微软恶意代码检测比赛第七名代码
  6. 安卓车机root改流浪地球_教你王者荣耀改战区
  7. 如何在5分钟内通过身份验证构建RESTful API —全部从命令行(第1部分)
  8. mac版小达人点读包怎么安装_小达人点读笔扩容实战:16G变128G
  9. 作者:冷芳玲(1978-),女,博士,东北大学计算机科学系讲师
  10. linux目录自动同步,Linux下rsync+inotify实现实时文件自动同步
  11. 冒着得罪大佬的风险,曝光下这件事
  12. 大数据分析软件具备哪些功能特点
  13. Python语音转文字、音频切割、语音识别
  14. FIT2CLOUD飞致云荣膺“2021年度OSCHINA优秀开源技术团队”奖项
  15. ISO 27001,能给企业带来哪些好处?
  16. 硬盘IDE和AHCI模式的区别
  17. 怎么让电脑微信安装到别的盘路径
  18. Cisco wlan controlller配置
  19. 戴尔电脑能升级鸿蒙系统嘛,戴尔台式机预装win10家庭版升级win10专业版方法教程...
  20. 关于cookie的详细讲解

热门文章

  1. 16m色真彩调色板设计制作
  2. 一个程序猿面试的毒鸡汤
  3. ubuntu美化桌面
  4. 飞行计算机人机工程,人机工程学ppt.ppt
  5. windows系统蓝屏集
  6. Leetcode.789.逃脱阻碍者---贪心+数学
  7. More accurate and efficient segmentation of organs-at-risk in radiotherapy with Convolutional Neural
  8. 学生护眼灯怎么选择?分享适合学生的护眼灯
  9. 闭包,一个浪漫的故事
  10. 【炼数成金-机器学习笔记】