517 遇到了前所未有的大危机!
他突发奇想,想下载 世界计划 彩色舞台 feat. 初音未来 ,却发现自己的手机容量不够用了。
但是作为 ACM 领域高手,517 自然不会轻易放弃。他发现一个 app 的安装有两个指标 d_i和 s_i
,前者表示安装包大小,后者表示安装完成后大小。
一个 app 在安装包下载完成后会自动安装。这意味着如果想下载一个 app ,至少需要 max(d_i, s_i)的空间。
但是 517 发现,一些 app 的 s_i < d_i
,这意味这其安装完成后变小了。这方便了后续的下载。
现在 517 清空了自己的手机,并列出了他想下载的 app 列表,并尝试用最佳的顺序使得能够下载的 app 数量最多。请问他最多能下载多少个 app ?
输入
第一行,两个正整数 n,m表示 app 数量和手机容量。
接下来 n 行 ,每行两个正整数表示 s_i,d_i。
输出
共一行,一个整数表示答案。
样例
输入 1复制
5 20
10 8
10 9
9 5
1 8
8 4
输出 1复制
3
提示
1 <= n,m <= 10^3
1 <= d_i,s_i <= 10^3
这个是我的代码:
# include <bits/stdc++.h>
using namespace std;
struct node{
int d,s,cha;
}a[100010];
bool cmp(node x,node y)
{
return x.cha < y.cha;
}
int dp[1010][1010],cnt[10010];
int main (){
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++)
{
scanf("%d%d",&a[i].d,&a[i].s);
a[i].cha = a[i].s-a[i].d;
}
sort(a+1,a+n+1,cmp);
for(int i = 1;i <= n;i++)
{
for(int j = m;j >= 0;j--)
{
dp[i][j] = dp[i-1][j];
if(j >= max(a[i].d,a[i].s))
{
dp[i][j] = max(dp[i][j],dp[i-1][j-max(a[i].d,a[i].s)]+1);
}
}
}
int mx = 0;
for(int i = 1;i <= n;i++)
{
for(int j = m;j >= 0;j--)
{
// cout << dp[i][j] << " ";
mx = max(mx,dp[i][j]);
}
cout << endl;
}
// cout << mx << endl;
return 0;
}
只拿了个20分,不知道哪里有问题,求求各位帮忙调一下吧