您的位置:首页 > 其它

【动态规划】受受的刷题计划

2012-08-06 10:22 148 查看
1. 受受的刷题计划(plan.pas/c/cpp)
【问题描述】
MZOI的2013级有个人叫受受,他喜欢刷题,并且坚定地相信题刷得越多就越NB,可是呢,他还是经常性地报铃或者线下第一……为此,受受很是苦恼。
这个暑假是Noip2012前的最后一个暑假,大家都在为Noip2012奋斗,受受决定要改变以前盲目刷题的坏习惯,要有选择性地刷题。
于是呢,他就找来了N道题,并且提前为它们确定了各项系数:V表示受受做了这道题之后的收获,K表示受受做了这道题之后死掉的脑细胞,T表示受受做这道题所花费的时间。
由于时间有限,并且脑细胞有限,所以不可能把所有题都刷一遍,受受希望知道这个暑假他所能得到的最大收获总值。
【输入格式】
输入文件为plan.in,文件的第一行为三个整数:N、K、T,分别表示受受有N道题,总共有K个脑细胞,假期时间为T单位时间;接下来有N行,每行有三个整数:Vi,Ki,Ti,分别表示这道题的收获、需要的脑细胞以及需要的时间。可能有多组数据。
【输出格式】
输出文件为plan.out,对每组数据只有一行,表示受受的最大收获总值
【输入样例】
2 2 2
1 2 1
2 1 2
【输出样例】
2
【数据范围】
对于100%的数据,有0<N,T,K<=200

简单题,一开始弄错以为脑细胞和时间必须耗完,所以错了,改了就对了。

不过数据是错得。ZQZ发现的,因为大家都做错了,背包体积是可能为0的。

还有用就地滚动是可以的。

#include <cstdio>
#include <cstring>
#include <string>
#define MAX(a,b) ((a)>(b)?(a):(b))
long n,A,B;
long v[210];
long a[210];
long b[210];
long f[2][210][210];
long getint()
{
long rs=0;bool sgn=1;char tmp;
do tmp = getchar();
while (!isdigit(tmp)&&tmp-'-');
if (tmp=='-'){tmp=getchar();sgn=0;}
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}
int main()
{
freopen("plan.in","r",stdin);
freopen("plan.out","w",stdout);

while (scanf("%ld%ld%ld",&n,&A,&B)==3)
{
for (long i=1;i<n+1;i++)
{
v[i] = getint();
a[i] = getint();
b[i] = getint();
}
for (long j=0;j<A+1;j++)
{
for (long k=0;k<B+1;k++)
{
f[0][j][k] = -0x7f7f7f7f;
}
}
f[0][0][0] = 0;
long ans = 0;
for (long i=1;i<n+1;i++)
{
for (long j=0;j<A+1;j++)
{
for (long k=0;k<B+1;k++)
{
f[i&1][j][k] = f[(i&1)^1][j][k];
if (j-a[i]>=0&&k-b[i]>=0)
{
f[i&1][j][k] = MAX(f[(i&1)^1][j][k],f[(i&1)^1][j-a[i]][k-b[i]]+v[i]);
}
}
}
}
for (long j=0;j<A+1;j++)
{
for (long k=0;k<B+1;k++)
{
ans = MAX(ans,f[n&1][j][k]);
}
}
printf("%ld\n",ans);
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐