博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
哇,今天做到一个十分666的题目,最后居然化成了背包,而其中的证明真是太妙了!!!...
阅读量:4959 次
发布时间:2019-06-12

本文共 1268 字,大约阅读时间需要 4 分钟。

 

 

一眼看去,完全看不出来这TM是背包。知道用背包可以借之后却还是一脸蒙蔽,后来经过LZ学长的点拨,终于顿悟了!!!

 

我们设f[i] 表示用取i个(也可以没有i个)数所可以得到的最大值,那么有方程式:f[i] = max(f[i] , f[v] + d[j])    v = i - l[j];

 

wokao!!! 这TM超级秒啊!!!

直接上个核心部分看看:

for(int j = 1; j <= n; j++) { for(int i = n; i >= l[j]; i--) { int v = i - l[j]; if(f[v] == -1) continue; f[i] = max(f[i], f[v] + d[j]); ans = max(ans, f[i]); } } 整个人都震惊了。。。 接下来是证明时间,为什么这么选出来之后的解必然是存在的,而不会有重叠。。。 假设有N个数字,选了K个数字,那么所有l[s](s属于K)的和必然小于等于N!!! 假设其中的A点会覆盖掉B点,那么就会出现两种情况:1~ B点没有覆盖其他点,那么先把B点挑掉就可以了; 2~ B点覆盖了C点,那么就继续向下找,看看C点覆盖了那些点,一直这样往下找,直到找到一个点没有覆盖其他点为止; 那么问题来了,为啥肯定有一个点没有覆盖其他点呢??? 那我们就假设只有三个点(多个点其实也差不多)A,B,C,且A覆盖B,B覆盖C,C覆盖A; 那么d[A] >= A - B + 1; 那么d[b] >= B - C + 1; 那么d[C] >= C - A + 1; (字母之间相减自己加上abs) 那么d[A] + d[B] + d[C] > N; 所以肯定不存在啊!!! 上代码!!!
#include
using namespace std;int l[51], d[51], n, ans;int f[51];int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d%d", &l[i], &d[i]); memset(f, -1, sizeof(f)); f[0] = 0; for(int j = 1; j <= n; j++) { for(int i = n; i >= l[j]; i--) { int v = i - l[j]; if(f[v] == -1) continue; f[i] = max(f[i], f[v] + d[j]); ans = max(ans, f[i]); } } printf("%d", ans);}

 

转载于:https://www.cnblogs.com/kczno1fans/p/7632579.html

你可能感兴趣的文章
【LeetCode & 剑指offer刷题】查找与排序题6:33. Search in Rotated Sorted Array(系列)
查看>>
GNU/Linux超级本ZaReason Ultralap 440体验
查看>>
icpc 南昌邀请赛网络赛 Max answer
查看>>
将github上托管的代码 在我的域名下运行
查看>>
【Manthan, Codefest 18 (rated, Div. 1 + Div. 2) C】Equalize
查看>>
【codeforces 767A】Snacktower
查看>>
【MemSQL Start[c]UP 3.0 - Round 1 C】 Pie Rules
查看>>
Ognl中“%”、“#”、“$”详解
查看>>
我对应用软件——美团的看法
查看>>
我最喜欢的 5 个 Gedit 插件
查看>>
OOoLatex:在 OpenOffice.org 中拔出 Latex 公式
查看>>
linu学习第二天:文件系统相关操作
查看>>
执行了的程序,才是你的程序.
查看>>
国内使用Google Maps JavaScript API
查看>>
在AxureRP8中实现广告文字滚动效果
查看>>
javaScript 事件流---冒泡 && 捕获
查看>>
原型和继承 constructor、prototype、__proto__
查看>>
html5 返回当前地理位置的坐标点(经纬度)
查看>>
DelayedQueue
查看>>
jQuery获取CSS样式中的颜色值的问题
查看>>