BZOJ 4247: 挂饰 题解
Description
Input
Output
Sample Input
0 4
2 -2
1 -1
0 1
0 3
Sample Output
HINT
题解:我表示这道题是在老师和同学耗尽心思的讲解中才勉强懂了一点却因为输入输出调了十遍RE。。。
不过很开心的是这道题在他人的讲解和我看题解的过程中让我对动归的理解比以前稍微好了一点(虽然还是很菜),希望能有更多提升。
好啦看题目,这道题其实就是背包的容量在不停的变化,用f[i][j]来表示挂完第i个物品后还剩j个挂钩,那么转移方程为f[i][j]=max(f[i-1][j],f[i-1][max(j-a[i],0)+1]+b[i]);
为什么这么写呢?解释一下:首先f[i][j]=f[i-1][j]很好懂就是指现在这个物品不挂,可取得的喜悦值,那么f[i-1][max(j-a[i],0)+1]是什么意思呢,我们先看j-a[i]+1,这是指上一次的挂钩值,那么后面的这个式子意思是把这个饰件挂上的喜悦值+上一次的喜悦值,但是j-a[i]是有可能小于0的,即如果第i个物品挂上去的话这次不可能就j个挂钩,这个时候我们就假设上一次只剩了一个挂钩,这样j个挂钩都是现在第i个物品带来的,即使j-a[i]<0,也可以当做我们把多余j的挂钩给舍去了。为什么我们要假设上一次只剩了一个挂钩呢?因为当前物品如果能挂上去,说明上一次多出的挂钩数一定大于等于1,却不能保证大于1,所以我们至多只能设上次只剩了一个挂钩(只有一是能被确定的),这就是这个式子让我当时最不理解的地方。。。。。
好啦,第二个重点,在做动归前我们需要将a数组排一下序,为何因为我们会发现如果不排序的话我们这次挂上这个饰品,即使j是负数也并不是不合法的,因为挂饰间可以互换位置,只要后面挂饰的挂钩能够把j在最后补成自然数就可以了,那样就会导致动归的循环不确定,没法一步步推,所以要进行排序。
ps:最好别用输入输出流,我的RE好像就错在这,可能是因为输入数据有点大吧。。。
具体程序:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
struct h{
int k,t;
}x[];
int cmp(const h&a,const h&b)
{
return a.k>b.k;
}
int max(int a,int b)
{
return (a>b?a:b);
}
int f[][];
int pop,n,ans;
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d %d",&x[i].k,&x[i].t) ;
//k为挂钩数,t为喜悦值
sort(x+,x+n+,cmp);//排序
memset(f,-,sizeof(f));//先预处理为最小值
f[][]=;//手机上原来就有个挂钩所以算作0;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
f[i][j]=max(f[i-][j],f[i-][max(j-x[i].k,)+]+x[i].t);
ans=;
for (int i=;i<=n;i++)
ans=max(ans,f[n][i]);//去看看最后的答案
printf("%d",ans);
return ;
}
BZOJ 4247: 挂饰 题解的更多相关文章
- BZOJ 4247 挂饰 背包DP
4247: 挂饰 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ 4247 挂饰(背包问题)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4247 [题目大意] JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将 ...
- BZOJ 4247 挂饰 01背包
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4247 JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机 ...
- bzoj 4247: 挂饰【dp】
bzoj上访问负下标会跑到奇怪的地方-- 其实可以滚动数组优化,但是我看能过就懒得改了 设f[i][j]为已经算了前i个挂饰,当前有j个空的钩子,转移就是f[i][j]=max(f[i-1][j],f ...
- BZOJ 4247: 挂饰
背包裸题 #include<cstdio> #include<algorithm> using namespace std; int F[2005]; struct node{ ...
- BZOJ 4247: 挂饰 动态规划
按照挂件数量排序,然后做一个 DP 就好了. code: #include <bits/stdc++.h> #define ll long long #define N 2003 #def ...
- bzoj 4247挂饰
背包????不会... #include<bits/stdc++.h> #define INF 0x7fffffff #define LL long long #define N 1000 ...
- bzoj千题计划197:bzoj4247: 挂饰
http://www.lydsy.com/JudgeOnline/problem.php?id=4247 先把挂饰按挂钩数量从大到小排序 dp[i][j]前i个挂饰,剩下j个挂钩的最大喜悦值 分挂和不 ...
- bzoj4247: 挂饰(背包)
4247: 挂饰 题目:传送门 题解: 看完题目很明显的一道二维背包(一开始还推错了) 设f[i][j]表示前i个挂饰选完(可以有不选)之后还剩下j个挂钩的最大值(j最多贡献为n) 那么f[i][j] ...
随机推荐
- WCF大文件传输
WCF传输文件的时候可以设置每次文件的传输大小,如果是小文件的时候,可以很方便的将文件传递到服务端,但是如果文件比较大的话,就不可取了 遇到大文件的话可以采取分段传输的方式进行文件传输 思路: 1.客 ...
- Fragment一些问题
1.使用fragment静态加载,当需要替换的时候使用replace方式是无效的....... 2.replace的容器如果是线性布局,那么将会出现之前的页面残留的情况,正确做法是使用FrameLay ...
- 遍历所有的选中的radio的个数和值
var ID = ""; $('input:radio:checked').each(function (i) { ...
- JS 退出系统并跳转到登录界面的实现代码
js代码如下: <script language="javascript" type="text/javascript"> function log ...
- QuerySet创建新对象的方法和获取对象的方法
新建一个对象的方法有以下几种: Person.objects.create(name=name,age=age) p = Person(name="WZ", age=23) p.s ...
- GIM企业即时通讯
GIM企业即时通讯是笔者Garfield(QQ:3674571)采用.NetFramework4.0+SQL2008R2开发的一套企业内网/外网 通用的即时通讯(IM)软件,分为服务器端和客户端,通讯 ...
- PHP 用html方式输出Excel文件时的数据格式设置
1) 文本:vnd.ms-excel.numberformat:@ 2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd 3) 数字:vnd.ms-excel.numb ...
- error C2259: 'CException' : cannot instantiate abstract class
vc6.0编译通过,VS2008则报错 解决方法: 把CException改为CUserException
- Android 下拉刷新框架实现
原文地址:http://blog.csdn.net/leehong2005/article/details/12567757 前段时间项目中用到了下拉刷新功能,之前在网上也找到过类似的demo,但这些 ...
- jQuery 屏幕遮罩
1.先做一个可以覆盖整个屏幕的div,颜色为黑色,然后再设置透明度,作为遮罩#zhezhao { position: absolute; top: 0px; left: 0px; width: 100 ...