收银员

在这里插入图片描述

分析

这第一眼看上去一定是一个动态规划题,因为要输出最xx的80%的题是动态规划。仔细思考,这是一个01背包,只不过多了个不能偷的条件。我用f[i]表示检测到第i个物品需要的最少花费。那么,有两种状态转移方程:

  1. 这个物品买单,前面的偷走(即j(检测到的物品,j倒着搜索)>t(现在物品要的时间)),f[j]=min(f[j],f[j-t-1]+c);j-t就是如果偷这个东西那么就相当于从第j-t个物品转移过来
  2. 如果不符合(1)的条件,则比较前面的物品偷走还是后面的物品偷走f[j]=min(f[j],c)

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2021;//中国共产党成立100周年 
int main()
{
	int n,ti,ci,f[N];
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	 f[i]=1e9;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&ti,&ci);
		for(int j=n;j>=0;j--)
		 if(j>ti)
		  f[j]=min(f[j],f[j-ti-1]+ci);
		 else
		  f[j]=min(f[j],ci);
	}
	printf("%d",f[n]);
}

猜你喜欢

转载自blog.csdn.net/qq_43034907/article/details/82952076