【DP】收银员
作者:互联网
思路
初看此题,觉得棘手。然后就K标
- Bob肯定是要把所有东西带走的。
- 如果将当前物品扫描,可以带走的物品数为扫描时间+1(即加上它自己)
- 这是一个背包题。还是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]);
}
标签:扫描时间,min,int,收银员,最小值,物品,include,DP 来源: https://blog.csdn.net/qq_42937087/article/details/88591189