今天写一个题目发现要用到背包的算法,我就去学了一下背包,来看看背包是啥。

背包问题,是你有一个背包可以装的最大的重量为k,有n件物品,每件物品有自己的价值和重量,你需要用背包装下的重量最大。

欧克来看看我最先学的算法

int f(int c){
if(max[c]!=-1){//如果s的钱的可以买的最大价值的东西你查过了直接返回答案return max[c];
}
int d,max1=0,v,space;
for(d=1;d<=n;d++){if(map[find(d)]==0){map[find(d)]++;space=c-no[find(d)].x;if(space>=0){//可以装的下v=no[find(d)].y;if(space>0){//还可以继续装int max2=f(space);//用剩下的空间继续装v+=max2;}if(v>max1)max1=v;//找最大的每递归一次就比较一次}

,这个方法是同一种得到物品可以反复装的 ,而且加入了动态规划会记录要装的重量为s情况下的最优解,如果下次需要查找s情况下的解,查过了的话就直接返回解,可惜我用这个算法并没有解决问题,题目的物品是不可以反复的拿的,于是我就加了一个检验的数组感觉跟写dfs一样,果不奇然,时间超限了我不理解。于是我去看了题解发现了01背包,我之前不知道有01背包这个算法于是我就去学习。

在经过几个小时的网课后对01背包的算法有了一点的理解,

首先一样的与背包问题是一样的,就是物品有两种的方式取和不取,用dp[i][j];i和j代表,容量为j取前i件商品的最优解。

分两种的情况,第i件商品所需容量大于容量j那么dp[i][j]=dp[i-1][j];因为第i商品你取不了,所以有和没有是一样的,

如果并没有大于的话那就是比较取了和不取那一个会更大,取max(dp[i-1][j],dp[i-1][j-x]+y)(x为商品的所需容量,y为商品的价值)

从i=0,j=0开始计算,找到i和j为你想要的时候,就可以得到答案了。

这是我上网课看到的代码(出自b站wumugo)就是这么一回事。

接下来看一看那道题目

明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有 nn 朵云,云朵已经被老板编号为 1,2,3,...,n1,2,3,...,n,并且每朵云都有一个价值,但是商店的老板是个很奇怪的人,他会告诉你一些云朵要搭配起来买才卖,也就是说买一朵云则与这朵云有搭配的云都要买,电脑组的你觉得这礼物实在是太新奇了,但是你的钱是有限的,所以你肯定是想用现有的钱买到尽量多价值的云。

输入格式

第一行输入三个整数,n,m,wn,m,w,表示有 nn 朵云,mm 个搭配和你现有的钱的数目。

第二行至 n+1n+1 行,每行有两个整数, c_i,d_ici​,di​,表示第 ii 朵云的价钱和价值。

第 n+2n+2 至 n+1+mn+1+m 行 ,每行有两个整数 u_i,v_iui​,vi​。表示买第 u_iui​ 朵云就必须买第 v_ivi​ 朵云,同理,如果买第 v_ivi​ 朵就必须买第 u_iui​ 朵。

输出格式

一行,表示可以获得的最大价值。

输入输出样例

输入 #1复制

5 3 10
3 10
3 10
3 10
5 100
10 1
1 3
3 2
4 2

输出 #1复制

1

说明/提示

  • 对于 30\%30% 的数据,满足 1 \le n \le 1001≤n≤100;
  • 对于 50\%50% 的数据,满足 1 \le n, w \le 10^31≤n,w≤103,1 \le m \le 1001≤m≤100;
  • 对于 100\%100% 的数据,满足 1 \le n, w \le 10^41≤n,w≤104,0 \le m \le 5 \times 10^30≤m≤5×103。

出自:https://www.luogu.com.cn/problem/P2078

思路就是把云进行合并然后用01背包大法直接乱杀.

合并的方法就是并查集这个不难这题目的就是看看你会不会背包和并查集,很不友好一开始我是不会背包的苦呀。

上码!

#include<stdio.h>
#include<string.h>
int n;
int fa[10100];
int map[10100];
struct f{//用结构体存放价值和要的钱,好处就是是绑定的。
int x;
int y;
}no[10100];
void chu(int l){//数组初始化每一个都是独立的
for(int h=1;h<=l;h++){fa[h]=h;
}
}
int find(int a){//找祖先以及压缩
if(fa[a]==a)return a;
else{
fa[a]=find(fa[a]);
return fa[a];
}
}
void heping(int j,int k){//合并而且把价值和钱也合并了
int h=find(fa[j]);
int z=find(fa[k]);
if(h!=z){
fa[h]=z;
no[z].x+=no[h].x;//因为是一起绑定的所以全部放在一起,价格和价值全放在头头那
no[z].y+=no[h].y;
no[h].x=0;
no[h].y=0;
}
}
int mx(int f,int q){//max函数比大小的,当然为什莫不用max因为我之前开了个max的数组
if(f>q)return f;
elsereturn q;
}int main(){
int m,s;
int arr[2];
scanf("%d%d%d",&n,&m,&s);
chu(n);
for(int u=1;u<=n;u++)scanf("%d%d",&no[u].x,&no[u].y);
for(int i=1;i<=m;i++){scanf("%d%d",&arr[0],&arr[1]);heping(arr[0],arr[1]);
}for(int g=1;g<=n;g++){//这就是dp不过是优化过的哈哈优化的方法及原理也可以去看一下b站for(int v=s;v>=no[g].x;v--){map[v]=mx(map[v],map[v-no[g].x]+no[g].y);}
}
printf("%d",map[s]);return 0;
}

当然如果你用这个

for(int g=1;g<=n;g++){for(int r=0;r<=s;r++){if(no[g].x>r)dp[g][r]=dp[g-1][r];elsedp[g][r]=mx(dp[g-1][r],dp[g-1][r-no[g].x]+no[g].y);}}
printf("%d",dp[n][s]);

当然可以不过,时间超限你是无法避免的苦呀,学了01背包的基本算法发现又过不了我的心是拔凉拔凉的所以优化救了我的命。

欧克,我大法慈悲的为你讲一讲这个算法的优化,首先我们是可以看道,dp[i][j]他只和dp[i-1][j]与dp[i-1][j-x]有关,那么我们就没必要保存之前的内存了,当然开两个数组也不太好,于是想办法用一个解决,dp[i];我们算这个的时候要用到的dp[i-1][j]就是dp[i];(和原来一毛一样没更新),dp[i-1][-jx],就是dp[i-x];i-x在dp[i]的前面我们从后往前面遍历就ok了呀。

欧克今天我要收工了,感觉没干啥就是格外的累呀这是咋回事,一定是身体不行了。

快跑保住我的小命。

学习日记1/5今天不是个好日子相关推荐

  1. java的圆周率_java学习日记,圆周率的打印

    前段时间看到听说学习java每天写技术贴会对自己提升很大,我现在学习java也就2个周,算不上技术贴,就写写学习日记吧. 昨天师傅给我出了一道题,说是试试用java打印圆周率. 刚开始我的思路是,如果 ...

  2. GPU(CUDA)学习日记(十一)------ 深入理解CUDA线程层次以及关于设置线程数的思考

    GPU(CUDA)学习日记(十一)------ 深入理解CUDA线程层次以及关于设置线程数的思考 标签: cuda存储线程结构网格 2012-12-07 16:30 6298人阅读 评论(4)收藏 举 ...

  3. GPU(CUDA)学习日记(十三)------ CUDA内存简介

    GPU(CUDA)学习日记(十三)------ CUDA内存简介 标签: cuda存储线程结构 2012-12-07 16:53 2902人阅读 评论(0)收藏 举报 分类: GPU(16) CUDA ...

  4. GPU(CUDA)学习日记(九)------ CUDA存储器模型

    GPU(CUDA)学习日记(九)------ CUDA存储器模型 标签: cuda存储bindingcache编程api 2012-09-27 10:53 1677人阅读 评论(1) 收藏 举报 分类 ...

  5. 语言余一个负数_C语言学习日记(8)——整数溢出

    小时候喜欢玩电子计算器,觉得很神奇,想要算什么数,立刻就能算出来.当时看着计算器的液晶屏幕就想,如果算一个很大的数,超过了屏幕上面数字的位数,会怎么样呢?试了以后结果是INF,那就是无穷大了.虽然当时 ...

  6. SpringMVC学习日记 1.Spring框架

    SpringMVC学习日记 1.Spring框架 Spring简介 Spring框架是一个开源框架,由Rod Johnson组织和开发,生产目的在于简化企业级应用的开发. 主要特性 非侵入(no-in ...

  7. 微信开发学习日记(一):快速阅读5本书,掌握整体背景

    2015年1月开始学习微信开发. 已经有多年开发经验了,从网上文章来看,微信开发主要是接口,然后是业务逻辑,不是很难.所以,我比较强调学习效率.一天学一点,是不能满足我的快速学习欲望的.       ...

  8. const 指针_C语言学习日记(11)——const与指针

    对于一个普通指针typet *p.p有三个最基本的能力,第一就是可以通过p = &obj来指向一个type类型对象,并随意切换指向对象.第二就是通过value = *p来读取它指向的对象的值. ...

  9. 十五的学习日记20160926-你不知道的JS笔记/

    十五的学习日记20160926 JavaScript 一个用于检测正负值的函数,可以用它辨别-0值. 我觉得挺好用,以后可以写到自己的工具库里. //函数:检查传入参数是否为正数.Number=> ...

最新文章

  1. Python程序员Debug利器,和Print说再见 | 技术头条
  2. u-boot移植:解决 Retry count exceeded; starting again
  3. python中的可变数据类型有列表和元组,为什么我们需要Python(或任何不可变数据类型)中的元组?...
  4. python写算法太慢_程序运行慢?你怕是写的假 Python
  5. spyder matlab,将pycharm配置为matlab或者spyder的用法说明
  6. 年轻人不能“饥渴”太久,否则……
  7. JavaFX官方教程(十五)之A Xylophone.java
  8. Spring自学日志02(对象的创建,依赖注入)
  9. python中的特殊函数__call__
  10. 《神经网络和深度学习》系列文章七:实现我们的神经网络来分类数字(下)...
  11. 【视频】线性混合效应模型(LMM,Linear Mixed Models)和R语言实现案例
  12. navicat for MySQL连接本地数据库时报1045错误的解决方法
  13. 在线制作流程,数据库模型,网络架构图,你所不知道的工具使用-Freedgo Design
  14. Lotus 新手运维手册
  15. 3dsmax动画渲染速度慢,渲染结果高糊的解决,图片渲染清晰,但变成动画就糊(Quicksilver硬件渲染器)
  16. 无需安装Microsoft Office和Adobe实现办公文档操作,Spire.Office免费资源清单一览
  17. BIOS内部模块详解
  18. 四大国际快递时效、优势对比
  19. 偷偷学Python,怎么高空建楼(Python自动化办公实现批量替换Word)
  20. 服务器中毒重装系统,电脑中毒如何重装系统 轻松解决有诀窍

热门文章

  1. 1205学习内容概要
  2. 计算机一级考试表格操作2016版,计算机等级考试一级MS_2016操作题模拟试题_第1套...
  3. Linux 常见指令及权限、OS(操作系统)基本概念
  4. 剪切板是计算机系统,剪切板
  5. 暴雪机器人消防_消防机器人技术在消防中的使用
  6. 搜索引擎的概念鄂州_搜索引擎的概念
  7. 个人怎么申请微信公众号-微信公众号使用教程33
  8. “区块链第一考”今天结束,史上首张“区块链技术软件开发师”证书即将发放...
  9. python毕业设计作品基于django框架校园新生报到系统毕设成品(4)开题报告
  10. Go项目实现优雅关机与平滑重启