随笔分类 - Dynamic Programming
摘要:1题解设m表秤刻度的个数,n表示秤砣的数目。数组p存储挂钩的位置,数组w存储秤砣的质量。d[i][j]存储前i个秤砣平衡度为j的最大组合数(平衡度j>0表示左边重,j<0右边重,j=0平衡)。利用动态规划状态方程思想:d[i][j] += d[i-1][j-p[k]*w[i]]前i个平衡度为j的数目 = 所有前i-1个,平衡度为 j-p[k]*w[i] 的数目(k取1~m)。这样才能取到最大。因为考虑到左右正负数的问题,所以所有j都加7500(20×25×15),此时平衡时j=7500。最后d[n][7500]即为所求。2源代码#include <iost
阅读全文
摘要:1思路多重背包问题,可以将其化为01背包问题。若用一般方法必TLE(把n个第i种物品看成毫无关联的n个物品,即∑ nii = 1,2…N个物品(N为物品数目))采用二进制思想,把n个第i种物品拆成1,2,4…2k,x个(其中x为不能再拆成2n次方而余下的)这样时间时间复杂度便由原来的θ(V×∑ ni)变为θ(V×∑ log ni)2源码#include <iostream>#include <algorithm> // sort头文件#include <cstring> // memset头文件using namespace std;in
阅读全文
摘要:1思路:f[j](1<=j<=m)数组用来表示j是不是可以达到,现假设可达。b[j](1<=j<=m)数组用在第二层循环中,表示当价值为j时物品i已经用了几个。记录此值的原因:例如已经知道了j=10可以取到,现还有物品A价值2,数目2。不能通过此信息知道12、14可达,因为j=10可达的时候有可能已经把A这两个物品都用过了,所以需要记录此值,当b[10]=2时表明A已经用过2次了,不能再用了,故12、14都不能可达。现假设有一物品价值a[i],数量为c[i],若b[j-a[i]]<c[i]表示i还没有用完,还可以再用。f[j-a[i]] == 1表明j-a[i]可
阅读全文


浙公网安备 33010602011771号