单调队列优化多重背包(pascal及翻译过去的C代码)
2012-04-05 03:22
295 查看
我最开始接触的相对高级的DP算法是从背包问题开始的。那是上学期新生赛的事,当时,在第二轮选拔赛中,有一道可能算是贪心算法的题,但是在我眼里却觉得这是一道背包问题。于是,我求助我们学校的大牛,问一下有什么关于背包算法的,而且比较容易让我弄懂的资料,最终他介绍我看《背包九讲》。
那时,甚至到现在,我只会基础的0-1背包,完全背包,多重背包的O(NClogC)算法……
一直卡着我的是多重背包的O(NC)算法。这个是我从一一篇叫做《国家集训队2008论文集——浅谈几类背包问题》的文章中看到的。我到现在都无法理解单调队列优化多重背包的原理,但是在网上找到一些关于单调队列优化多重背包的代码。对我来说,要理解一种算法的原理最好的方法是模拟算法的运行,因为我的快排原理和0-1背包的原理都是这样弄懂的。在网上只找到pascal的代码,而我把他翻译成C语言的,并且测试是正确的:
View Code
补充1:如果用上面的代码,这个不就成了背包的万能公式了吗?
生搬硬套应该也可以解决不少背包的基本问题吧?
那时,甚至到现在,我只会基础的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:如果用上面的代码,这个不就成了背包的万能公式了吗?
生搬硬套应该也可以解决不少背包的基本问题吧?
相关文章推荐
- poj1742coins【单调队列优化多重背包】楼教主八题
- poj 2754 Similarity of necklaces 2 转换成多重背包,单调队列优化/ 二进制优化
- POJ 1742 Coins 多重背包单调队列优化
- 【C++心路历程36】单调队列优化多重背包
- HDU1059 单调队列优化 多重背包O(VN)
- poj1742 单调队列优化多重背包
- [Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)
- hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活【单调队列优化多重背包】
- POJ 1742 Coins(多重背包 + 单调队列优化)
- HDU1171 单调队列优化多重背包O(VN)
- [总结] 单调队列优化多重背包学习笔记
- 单调队列优化的多重背包
- BZOJ4182 shopping 点分治+多重背包单调队列优化
- 使用单调队列优化的 O(nm) 多重背包算法
- WZOJ 1304 01背包加强版(完全背包单调队列优化)
- hdu2191(单调队列优化dp,多重背包)
- hdu2191多重背包单调队列优化
- POJ 1742 Coins 多重背包(单调队列优化)
- 【POJ1276】Cash Machine(多重背包单调队列优化)
- POJ 1742 Coins 多重背包用单调队列优化