90分收银员【DP】

在这里插入图片描述


>解题思路
使用DP:把时间看做空间,单价看为价值。
f[i]表示用了多少时间(实际情况实际判断:某几个物品的购买时间,其他的是偷过来的 ,但是每件物品的购买时间都要++,因为还要包括它本身),这样表示也可以看成f[>=n]就是至少买了n件物品了,因为偷一件物品的时间为1。

然鹅还有一个数据点超时了有大神帮我改一下这个方法吗


>代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,c,t,s;
long long f[2005],ans;
int main()
{
	memset(f,0x7f,sizeof(f));
	scanf("%d",&n);
	ans=f[0]; f[0]=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&t,&c);
		t++; s=max(s,t+n);
		for(int j=s;j>=t;j--)
		 f[j]=min(f[j],f[j-t]+c);
	}
	for(int i=s;i>=n;i--)
	 ans=min(ans,f[i]);
	printf("%lld",ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/88910591
90