Time:2016.07.19
Author:xiaoyimi
转载注明出处谢谢
传送门1
传送门2
传送门3
思路:
比较神的DP
“贪心确定DP的状态”——reflash
写了暴力出来才发现好像按a+b排序是正确的……
DP方程还是挺简单的
但我发现我的动态规划真的什么都不会啊啊啊啊
注意:f数组用int足矣
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define M 100003
using namespace std;
int n,H,ans,f[M];
struct node{
int a,b;
bool operator <(node other)const{
return a+b<other.a+other.b;
}
}data[M];
int in()
{
int t=0;char ch=getchar();
while (!isdigit(ch)) ch=getchar();
while (isdigit(ch)) t=(t<<1)+(t<<3)+ch-48,ch=getchar();
return t;
}
main()
{
memset(f,-1,sizeof(f));
f[0]=0;
n=in();
for (int i=1;i<=n;i++)
data[i].a=in(),
f[0]+=data[i].a,
data[i].b=in();
H=in();
sort(data+1,data+n+1);
for (int i=1;i<=n;i++)
for (int j=ans;j>=0;j--)
if (f[j]+data[i].b>=H)
{
f[j+1]=max(f[j]-data[i].a,f[j+1]);
if (f[ans+1]>=0) ans++;
}
printf("%d",ans);
}