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. ExtJs 备忘录(3)—— Form表单(三) [ 数据验证 ]
  2. python中返回上一步操作的代码_Pycharm代码跳转后退回操作详解
  3. 面向对象开发===继承特点
  4. texlive写论文源代码_Texlive 2020 编译胡伟《latex2e完全学习手册》后记字体右倾90度...
  5. python ftp上传_Python FTP传输的简单示例
  6. 萝卜魂军曹机器人_【BANDAI】萝卜魂 全金属狂潮TSR RK-92 野蛮人 沙色
  7. charles浏览器抓包https_十分钟学会Charles抓包(iOS的http/https请求)
  8. python处理rgb_如何读取Python中给定像素的RGB值?
  9. [转]FTP搜索引擎的设计与实现(优化版)
  10. python 编译成exe vmp加密_加密软件VMProtect入门教程
  11. MySQL 每周总结(4周)
  12. Matlab中sqrt函数的用法
  13. 苹果app退款_你有一笔来自苹果App Store的不明扣款
  14. 怎么将图片内容转换成文字?这两种方法可以轻松实现
  15. Memcache/Redis集群管理探索与实现:美图开源PaaS平台资源网关
  16. 【2014 年末岁首】
  17. 【来日复制粘贴】数据透视表分类不同账龄
  18. docker部署Harbor
  19. php下载微信头像,并操作图片合成水印
  20. 【Chinese Lexical Simplification 论文精读】

热门文章

  1. 基于Netty和Kafka的物联网数据采集系统
  2. PCIE2PCI104载板转接卡
  3. 基于随机森林算法的多因子选股方法分析与实现(2,代码实现)
  4. 网络云存储技术Windows server 2012 (项目十二 为企业构建虚拟共享服务(工作组模式下的DFS))
  5. 回收站删除数据恢复怎么操作
  6. Outlook 2019 中文邮件乱码的问题
  7. 26,verilog之常数终极使用规则
  8. 关于计算机网络里的计量单位G\M\K
  9. Photoshop类图片处理软件
  10. 防网络广告作弊(点击欺诈)的八种方法