DFS解决木材拼接问题

DFS解决木材拼接问题

  • 题目描述
  • DFS实现,只输出木材数量
    • 示例输入
    • 示例输出
  • 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

你可能感兴趣的:(算法,DFS,c语言,算法,c++)