>解题思路
使用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;
}