思路:
这是一道背包,我们设f[k]为k个物品的最少支付价钱,k-t-1表示他们的最小支付(包括这个物品自己本身的价值),然后再用一个方程表示直接偷掉。
代码:
#include<cstdio>
#include<iostream>
using namespace std;
int n,f[10000],t,c;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
f[i]=1000000000;//手动赋一个大值,当然,你用memset也可以。
for(int i=1;i<=n;++i)
{
scanf("%d%d",&t,&c);//输入。
for(int k=n;k>=t;--k)
f[k]=min(f[k],f[k-t-1]+c);//方程一
for(int k=t;k>=0;--k)
f[k]=min(f[k],c);//方程二
}
printf("%d",f[n]);//输出n件物品所需要的最小价格。
}