多重背包问题一般用迭代搜索。 用动规的话内存不够的。一般出这种题都会存在很好的剪枝。
以USACO 4.1.2 Fence Rails (fence8)为例:
我们用迭代搜索(DFSID)来解决。
枚举能放入的rail数,然后DFS搜索是否有解,因为每个rail的价值都是1,所以对于放入d个rail,肯定选择长度最小的d个rails从board中切。
把rail按长度升序排序,搜索每个board中放哪些rail,DFS(bn,dep)来搜索当前第bn个board,已放入dep个rail的方案,这里有两个剪枝:
1.任何时刻board中剩余的空间都要>=等待放入的rail的长度和,如果不满足这个条件就剪枝。
2.如果几个rail的长度一样,而用其中的1个放入当前board中无法得到解,那么直接跳过所有和这个rail长度一样的rail。
边界条件:dep>r时有解,bn>n时无解。
此外,枚举能放入的rail数时,我们采用二分枚举来加快速度。