.
.
.
.
.
.
分析
完成任务是使所有物品全部买或偷到,而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;
}