收银员
题目大意:
有n件物品,每件物品有他的扫描时间和价格,在扫描的时候可以偷物品(一个单位时间偷一件),问最少给多少钱
原题:
解题思路:
设f[j]为偷或买共j件花的最少钱,就得出f[j]=min(f[j],f[j−t−1]+c)f[j]=min(f[j],f[j-t-1]+c)f[j]=min(f[j],f[j−t−1]+c),再减一是买了的一个,要么就对于j<t的就是f[j]=min(f[j],c)f[j]=min(f[j],c)f[j]=min(f[j],c)
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,t;
long long c,f[2005];
int main()
{scanf("%d",&n);for (int i=1;i<=n;++i)f[i]=1<<30;//一个很大的值for (int i=1;i<=n;++i){scanf("%d %lld",&t,&c);for (int j=n;j>t;--j)f[j]=min(f[j],f[j-t-1]+c);//前面买过,再一次买for (int j=1;j<=t;++j)f[j]=min(f[j],c);//前面没买过,直接买}printf("%lld",f[n]);
}