收银员

题目大意:

有n件物品,每件物品有他的扫描时间和价格,在扫描的时候可以偷物品(一个单位时间偷一件),问最少给多少钱

原题:

【DP】收银员

解题思路:

设f[j]为偷或买共j件花的最少钱,就得出f[j]=min(f[j],f[jt1]+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)

代码:

#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]);
}

相关文章:

  • 2021-11-20
  • 2021-12-16
  • 2021-10-28
  • 2021-09-20
  • 2021-04-24
  • 2022-02-03
  • 2021-06-07
  • 2021-07-16
猜你喜欢
  • 2022-01-22
  • 2022-12-23
  • 2021-06-08
  • 2022-12-23
  • 2021-12-04
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案