【DFS】【剪枝】【DG特长生2012】栅栏的木料

农民John需要从木板中切割出特定规格的木料来建造栅栏。他使用DFS算法并实现多种剪枝策略,如当所需木料总和大于现有木料总和时停止,无法凑出最小规格木料时舍弃木板等,以优化解决方案。文章提供了问题的解析和相关代码。
摘要由CSDN通过智能技术生成

农民John准备建一个栅栏来围住他的牧场。他已经确定了栅栏的形状,但是他在木料方面有些问题。当地的杂货储存商扔给John一些木板,而John必须从这些木板中找出尽可能多所需的木料。
当然,John可以切木板。因此,一个9英尺的木板可以切成一个5英尺和一个4英尺的木料 (当然也能切成3个3英尺的,等等)。John有一把梦幻之锯,因此他在切木料时,不会有木料的损失。
所需要的木料规格都已经给定,每种规格的木材最多需要1块(注意:如果给定的规格值相同,则也各要一块),当然也有可能某些规格的木料无法切出。


DFS。烤点TJH的题解。(懒)

剪枝1:如果你要凑出的数的和大于你有的数的和,那很明显就不能凑出。
剪枝2:有一些你有的出连最小的要凑出的数都凑不出,那这个木板可以直接舍去不要。
剪枝3:在操作的过程总如果有一些数被减到来弄最小的需要的木板都凑不出,那这个木板就直接不要了。
剪枝4:我们可以搞一个变量,记录还可以损失多少的数,然后操作的时候维护一下。如果它要被减到负数,那这种方案就是不可行的。
剪枝5:我们可以把给你的数和要拼的数都从小到大排序一下,算的时候会减少时间,也可以根据这个进行下面的剪枝6。
剪枝6:如果两个要拼的数一样大,那你可以直接从拼出上一个要拼的数的位置开始看选哪个数拼出来。(因为根据前面,你前面的一定不能拼出它,就算能,它就像 a b abab 和 b a baba 一样,a b abab 相等,它是重复的)
————————————————
版权声明:本文为CSDN博主「SSL_TJH」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43346722/article/details/116402335


代码

#include<cstdio>
#include<algorithm>
#include<iostream>
#define fr(i,x,y) for(register int i = x; i <= y; ++i)
#define frr(i,x,y) for(register int i = x; i >= y; --i)
using namespace std;
int n, m[1200], need[1200], r, l, mid, flag, qqq = 0, summ, sumn[1200], sss;
void dfs(int d, int qs, int waste){
   
	if(d == 0){
   
		flag = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值