本文主要是介绍收银员,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
.
.
.
.
.
.
分析
完成任务是使所有物品全部买或偷到,而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;
}
这篇关于收银员的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!