【DP】收银员


思路

初看此题,觉得棘手。然后就K标

  1. Bob肯定是要把所有东西带走的。
  2. 如果将当前物品扫描,可以带走的物品数为扫描时间+1(即加上它自己)
  3. 这是一个背包题。还是01背包。

设置:

f[j]=拿了j个物品支付的最小值。
t为商品扫描时间。

初始化:

for(int i=1;i<=n;++i)
	  f[i]=1000000000;
f[0]=0;

状态转移方程:

f[j]=min(f[j],f[j-t-1]+q);  
//拿了j个物品支付的最小值=min(自己,(拿了j-t-1物品的时间所支付的最小值+此物品价值));
//这里-1代表偷走前面一个。
f[j]=min(f[j],q);  //直接偷。   

#include<cstdio>
#include<iostream>
using namespace std;
int n,q,t,f[2001];
int main(){
	
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	  f[i]=1000000000;
	for(int i=1;i<=n;++i){
	    scanf("%d%d",&t,&q);
		for(int j=n;j>t;--j)
		  f[j]=min(f[j],f[j-t-1]+q);
		for(int j=t;j>=0;--j)
		  f[j]=min(f[j],q);
	} 
	printf("%d",f[n]);
}

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/88591189