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