这个题是我做usaco第一个不看解题报告做不出来的题目。
题目大意:有N根木料,和需要R根木板,我们就要判断最多可以用那些木料可以切出多少根木板。木料和木板的长度都可能是不同的。N <=50 R <1024 还有木板的长度要小于128。
根据木板的长度小于128我们可以知道有很多种重复的木板长度是我们需要的,这里就是剪枝的关键所在了。我们当然知道是用深搜判断能否切出X根木板。我是一个一个木板搜,看看能不能满足要求。首先是判断最大的根数,然后递减的判断能不能满足条件。很容易证明能切出X根木板,就一定可以切出X小的木板,所以我们要先把木板排序,然后搜索。
剪枝:
1 如果有三根连续的相等的木板是我们需要的我们可能用木料中的3 2 1和3 1 2去切,这样结果是一样的,所以我们可以剪枝,我们只要相等的时候就按照不增的顺序搜,这样就不会有3 1 2的切法了。木料也可能这样处理。
2 浪费值剪枝,只要剩下的木料的长度<最小的木板长度,这部分就会浪费掉,我们同样可以知道在判断X的时候的最大浪费值,如果浪费值〉最大浪费值当然要剪枝
3 其他在前面已经讲了