DFS解决木材拼接问题

题目描述

现在有一批长度不同的木材woods,现在需要将木材进行拼接,正好达到总长度length,在不考虑切割木材,并且每种长度的木材不限量供应的情况下,返回满足要求的最少木材数量,如果无法通过组合达到规定长度,则返回-1。

DFS实现,只输出木材数量

const int MAX_WOOD=30;
int woods[MAX_WOOD]={0}; //存放木材长度
int n= 0; // 木材总量
int length= 0; // 要求木材长度
unsigned int min_wood=-1;// 最小木材数量
void DFS(int index,int sumW,int sumL)
{
	if(index == n || sumL>=length)
	{
		if(sumL == length && min_wood>sumW)
		{
			min_wood = sumW;
		}
		return;
	}
	DFS(index+1,sumW,sumL);
	if(sumL+woods[index]<=length)
	{
		DFS(index, sumW + 1, sumL + woods[index]);
		DFS(index + 1, sumW + 1, sumL + woods[index]);
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;++i)
	{
		scanf("%d",&(woods[i]));
	}
	scanf("%d",&length);
	DFS(0,0,0);
	printf("num = %d\n",min_wood);
	return 0 ;
}

示例输入

4
1 2 3 5
9

示例输出

num = 3

DFS实现,输出木材数量以及木材选择方案

const int MAX_WOOD=30;
int woods[MAX_WOOD]={0}; //存放木材长度
int n= 0; // 木材总量
int length= 0; // 要求木材长度
unsigned int min_wood=-1;// 最小木材数量
vector<int> wood_inf; //用于存放中间过程
vector<int> wood_inf1; // 用于存放最后方案
void DFS(int index,int sumW,int sumL)
{
	if(index == n || sumL>=length)
	{
		if(sumL == length && min_wood>sumW)
		{
			min_wood = sumW;
			wood_inf1 = wood_inf;
		}
		return;
	}
	DFS(index+1,sumW,sumL);
	if(sumL+woods[index]<=length)
	{
		wood_inf.push_back(woods[index]);
		DFS(index, sumW + 1, sumL + woods[index]);
		DFS(index + 1, sumW + 1, sumL + woods[index]);
		wood_inf.pop_back();
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;++i)
	{
		scanf("%d",&(woods[i]));
	}
	scanf("%d",&length);
	DFS(0,0,0);
	printf("num = %d\n",min_wood);
	for(int i=0;i<wood_inf1.size();++i)
	{
		printf("%d\t",wood_inf1[i]);
	}
	return 0 ;
}

示例输入

4
1 2 3 5
9

示例输出

num = 3
3 3 3
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式魔法师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值