您的位置:首页 > 编程语言

单调队列优化多重背包(pascal及翻译过去的C代码)

2012-04-05 03:22 295 查看
  我最开始接触的相对高级的DP算法是从背包问题开始的。那是上学期新生赛的事,当时,在第二轮选拔赛中,有一道可能算是贪心算法的题,但是在我眼里却觉得这是一道背包问题。于是,我求助我们学校的大牛,问一下有什么关于背包算法的,而且比较容易让我弄懂的资料,最终他介绍我看《背包九讲》。

  那时,甚至到现在,我只会基础的0-1背包,完全背包,多重背包的O(NClogC)算法……

  一直卡着我的是多重背包的O(NC)算法。这个是我从一一篇叫做《国家集训队2008论文集——浅谈几类背包问题》的文章中看到的。我到现在都无法理解单调队列优化多重背包的原理,但是在网上找到一些关于单调队列优化多重背包的代码。对我来说,要理解一种算法的原理最好的方法是模拟算法的运行,因为我的快排原理和0-1背包的原理都是这样弄懂的。在网上只找到pascal的代码,而我把他翻译成C语言的,并且测试是正确的:

View Code

for(__int64 i=1; i<=n; i++)
{
scanf("%I64d%I64d%I64d", &m, &s, &c);
if(c==0||t/m<c)c=t/m;
for(__int64 d=0; d<=m-1; d++)
{
l=1;
r=0;
for(__int64 j=0; j<=(t-d)/m; j++)
{
insert(j, f[j*m+d]-j*s);
if(a[l]<j-c)
l++;
f[j*m+d]=b[l]+j*s;
}
}
}
printf("%I64d\n", f[t]);


  补充1:如果用上面的代码,这个不就成了背包的万能公式了吗?

  生搬硬套应该也可以解决不少背包的基本问题吧?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: