洛谷P3891 [GDOI2014]采集资源

DP

题目传送门

预处理 f 1 [ i ] f1[i] f1[i]表示用 i i i的资源能得到的最大效率。因为苦工的数量无限制,那么这就是一个完全背包。

f 2 [ i ] [ j ] f2[i][j] f2[i][j]表示第 i i i时间剩下 j j j的资源能得到的最大效率。那么就可以借助 f 1 f1 f1进行转移了。

注意一有答案就要退出,不然会T。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 105
#define M 1005
using namespace std;
typedef long long LL;
int n,m,t; LL c[N],w[N],f1[M],f2[M][M];
int main(){
	scanf("%d%d%d",&n,&m,&t);
	if (m>=t) return puts("0"),0;
	for (int i=1;i<=n;i++)
		scanf("%lld%lld",&c[i],&w[i]);
	memset(f1,-1,sizeof(f1)),f1[0]=0;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=t;j++)
			if (j>=c[i]&&(~f1[j-c[i]]))
				f1[j]=max(f1[j],f1[j-c[i]]+w[i]);
	memset(f2,-1,sizeof(f2)),f2[0][m]=0;
	for (int i=0;i<=t;i++){
		if (~f2[i][t]) return printf("%d\n",i),0;
		for (int j=0;j<=t;j++){
			if (f2[i][j]==-1) continue;
			for (int k=0;k<=j;k++){
				if (f1[k]==-1) continue;
				LL d=j-k+f2[i][j]+f1[k];
				if (d>=t) return printf("%d\n",i+1),0;
				f2[i+1][d]=max(f2[i+1][d],f2[i][j]+f1[k]);
			}
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值