背包是什么知道撒01背包是指每个物品只能用一次完全背包指的是每个物品都能无限使用没什么技巧,DP类的明确了状态后就写起来快了,写多了程序自然也就有经验了,有经验就能快速的推出状态,总之就是多写题 程序的不同很简单完全背包for i:=1 to n do //枚举1-N的物品for j:=a to m do //枚举1-M的能背出来的范围
f[j]:=f[j] or f[j-a];01背包for i:=1 to n do //枚举1-N的物品for j:=m downto a do //枚举1-M的能背出来的范围
f[j]:=f[j] or f[j-a];注意,之前要先f[0]:=true;可以看出,区别只在第二个循环的正倒,F是一个布尔数组,F表示i这个数字能够被组合出来为什么循环的正倒会导致这样的区别呢?我们举个例子:假设我们现在组合出了3,现在讨论的物品体积是1,那么,即a=1, f[3]:=true;当正循环时当枚举到4的时候,f[4]=f[4] or f[4-1]=true,因为f[3]=true;当枚举到5的时候,f[5]=f[5] or f[5-1]=true,因为f[4]=true;显然,这个“1”会被无限的使用下去直到到达M的上限逆循环则相反 ----------------纯原创,求最佳···