题解 CF19B
Silence_water · · 题解
题目传送门
题目分析
本题是01背包的变形
从题目中我们可以得知一件商品
那么在扫描这件物品的同时我们可以偷走
也就是说,扫描物品
那么问题就可以转化成这样的背包问题:
一共有
那答案要去求的是什么呢?
假设我们一共付了
我们为了尽可能地得到更多的物品,会将能偷到的
但到了扫描第
所以答案要求的是得到至少
因此我们可以推出背包的最大容量为
然后我们来观察一下数据范围:
考虑当所有物品扫描时间
此时答案的极限值为:
因此
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int M=2005,N=4005;
int n,t[M],v;
ll c[M],dp[N],ans=2e12;//注意ans的初始值
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%lld",&t[i],&c[i]);
t[i]++;//将t数组转换为用来存物品"体积"
v=max(v,t[i]);
}
v+=n;//算出最大体积
memset(dp,0x7f,sizeof(dp));dp[0]=0;//对dp数组进行初始化
for(int i=1;i<=n;i++)
for(int j=v;j>=t[i];j--)
dp[j]=min(dp[j],dp[j-t[i]]+c[i]);//01背包
for(int i=n;i<=v;i++)
ans=min(ans,dp[i]);//在所有满足条件的物品个数中寻找耗费最少的方案
printf("%lld",ans);
return 0;
}
看懂了别忘点个赞在走ya