`
huobengle
  • 浏览: 860639 次
文章分类
社区版块
存档分类
最新评论

USACO Section 5.3 Milk Measuring - DFSID+DP...

 
阅读更多


这道题要是不要写具体方案数就很普通的可重复背包了..对一个bool数组进行DP...从1做到Pnum..每次当k空间的k-P[i]为可得到时..k空间则可得到...每次扫描空间从0到Q.最后当Q为true..这些物品各种可重复的组合说能得到Q...

 但要求具体的方案数就eggache了..开始我想用一个当在做重复背包的时候跟着判断并传递...每个空间不为bool...而是一个struct..包括到达这个空间的最小物品数..以及按字典序最小的那几个..也就是

    struct node

{

int num,a[105];

}

应该是行得通的...空间来说Q最大20000...每个空间挂100的int数组..那么相当于开了个2000000的int 数组.在USACO允许的空间内..

 既然这节的TEXT就是写的搜索...我还是练了下DFSID...2分枚举当且查找方案的所用物品个数...然后搜能否得到解...而当判断有无解时就是一样的可重复背包..能背出Q就是可行解...不难发现若先搜较小的数更容易提前搜出答案...所以对P先排序...

 这里有个很强劲的剪枝...就是边往深层DFS一种方案时..当枚举的当且某物品单个大小前面就能背出来..那就没必要再以这个物品往下搜了..因为这个物品的单个价值前面能得到..那么它与所有的数怎么怎么样相加都不能对背包空间做出任何更新....

 还有个比较重要的剪枝..当搜(1,2)..显然得到的结果与搜(2,1)一样..所以在DFS搜一种方案时就要保证每一层所选择的物品必须在上一层的后面...


Program:



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics