收银员

在这里插入图片描述
.
.
.
.
.
.
分析
完成任务是使所有物品全部买或偷到,而Bob有多少扫描时间便能偷多少物品,所以扫描了某一物品,能带走的物品便是扫描时间,加上1(也就是你正在扫描的这个物品),在这里可以直接把扫描时间+1,那么现在扫描时间就等价与能带走的物品个数了。

之后我们将扫描时间看作体积,价格看作价值。那么题目便等价与把背包体积至少装至n的最小价值,就和01背包一样了。
.
.
.
.
.
.
程序:

#include<iostream>
#include<cstdio>
using namespace std;
int n,m=0,t[2001],c[2001];
long long f[5000],ans=1<<30;

int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d",&t[i],&c[i]);
        t[i]++;
        if (t[i]>m) m=t[i];
    }
    m+=n;
    for(int j=1;j<=m;j++)
    	f[j]=1<<30;
    f[0]=0;
    for (int i=1;i<=n;i++)
    	for (int j=m;j>=t[i];j--)
    	{
    		f[j]=min(f[j],f[j-t[i]]+c[i]);
    		if (j>=n) ans=min(ans,f[j]);
    	}
    printf("%d",ans);
    return 0;
}
posted @ 2018-10-06 16:26  银叶草  阅读(81)  评论(0编辑  收藏  举报
Live2D