作 业 作业 作业
题目链接:jzoj 1986
题目大意
要用 k k k小时尽可能的写作业。第 i i i个作业要用 t i ti ti个小时写,写不完会有一个批评力度 p i pi pi。我们要让批评力度的和最小,并输出它。
样例输入
5
3
2 6
1 3
4 7
样例输出
6
数据范围
100%的数据中, k<=100000, ti<=10000, pi<=10000;
30%的数据中, n<=20;
100%的数据中, n<=500。
思路
这道题其实就是一道01背包,但是要变形。
因为求最小批评力度比较难,那我们不如求出“最小不批评力度”,再用最大批评力度减去它,就可以求出来。
最大批评力度,就是什么作业都不做,批评力度全部加起来,就能得到了。
而“最小不批评力度”,就可以用01背包求出。
那么这样子,这道题就可以做出来了。
代码
#include<cstdio>
#include<cstring>
#define max(a,b) (a)>(b)?(a):(b)
using namespace std;
int n,k,t[501],p[501],f[100001],sum;
int main()
{
// freopen("homework.in","r",stdin);
// freopen("homework.out","w",stdout);
scanf("%d%d",&k,&n);//读入
for (int i=1;i<=n;i++)
{
scanf("%d%d",&t[i],&p[i]);//读入
sum+=p[i];//求出批评力度的最大值
}
for (int i=1;i<=n;i++)
for (int j=k;j>=t[i];j--)
f[j]=max(f[j],f[j-t[i]]+p[i]);//01背包
printf("%d",sum-f[k]);//输出
// fclose(stdin);
// fclose(stdout);
return 0;
}