将所有t[i]加1,就是求容量为n的01背包问题.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t[2048];
ll c[2048];
ll dp[2048];
ll ans;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%lld",&t[i],&c[i]);
t[i]++;
if(t[i]>=n) t[i]=n;
}
memset(dp,0xff,sizeof(dp));
dp[0]=0;
ans=-1;
for(int i=0;i<n;i++)
{
for(int j=n;j>=0;j--)
{
if(dp[j]==-1) continue;
if(j+t[i]<n)
{
if(dp[j+t[i]]==-1) dp[j+t[i]]=dp[j]+c[i];
else
dp[j+t[i]]=min(dp[j+t[i]],dp[j]+c[i]);
}
else
{
if(ans==-1) ans=dp[j]+c[i];
else ans=min(dp[j]+c[i],ans);
}
}
}
//ans=min(ans,dp[n]);
printf("%lld\n",ans);
return 0;
}