题目描述
现在有一批长度不同的木材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