user-0 提问: 拼长度问题，求高手老师给予帮助！谢谢!

回复:
user: user-0
content: 谢谢，各位老师的认真详细的解释！@jianwen0529 @user-4 @zhao4zhong1  非常感谢！ 我是门外汉，不懂怎么编程，是C/C++语法是吧，谢谢~

user: user-1
content: 穷举法  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-2
content: 引用 4 楼 jianwen0529 的回复:[quote=引用 3 楼 kuangbao9 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] 你这个数据量很少，遍历所有情况，选择剩余少的那种情况就可以了，很小的一个算法。  现在只有28米=2支 ，49米=3支 ，55米=4支这三种，那要是每次种类都不一样呢？这个该怎么去写一个函数遍历呢？[/quote] 一楼已经给出代码了 28米=2支 ，49米=3支 ，55米=4支 分别有3 4 5种选择（不选也是一种选择）（例如28m线，不取，取一根，取两根） 设x为记录剩余的长度，可以初始化为55或者更大（因为最佳情况不可能剩余超过或等于55m，用于后续的比较） 组合所有情况，当不满足115m需求则舍弃该种组合。当满足时，记录此种选择并跟之前比较是不是剩余更少。 最后，剩余最少的就是最佳组合了。[/quote]  我的意思是28米=2支 ，49米=3支 ，55米=4支， 66米 = 2, 56米 = 5,..............后面不知道有多少个，这个怎么设计函数

user: user-3
content: ComputeMaxNumNeeded这个函数可有可无，是之前设计思路写的。  不过如今那个递归求解的函数已经间接做了ComputeMaxNumNeeded这个事情，虽然也是多了一些计算，但是影响不大

user: user-3
content: #include <stdio.h> #include <stdlib.h> #include <limits.h>  #define  MAX_COUNT 100  //0记录材料规格长度，1记录总数，2记录最多需要的数量 int _material[MAX_COUNT][3] = { 0 }; int _num_material = 0;  void ComputeMaxNumNeeded(int needLength) {     int i, maxNum;     for (i = 0, maxNum = 1; i < _num_material; ++i)     {         while (_material[i][0] * maxNum < needLength && maxNum < _material[i][1])             ++maxNum;         _material[i][2] = maxNum;     } }  int MinSurplus(int(*material)[3], int num, int needLength, int *result) {     int i, j;     int len, totalLen = 0;     int minSurplus = INT_MAX;      // 递归结束条件     if (num == 0)         return 0;          *result = 0; //首先设置此索引默认值     for (i = 0; i <= (*material)[2]; ++i)     {         // 重置之后的索引记录项，防止之前计算45设置了但是此次却没有递归导致索引错误         for (j = 1; j < num; ++j)             *(result + j) = 0;          len = (*material)[0] * i;         // 如果还未够长度，则递归         if (len < needLength)             len += MinSurplus(material + 1, num - 1, needLength - len, result + 1);          // 判断此种情况是否为最优结果，是则记录所需信息         if (len > needLength && len - needLength < minSurplus)         {             *result = i;             totalLen = len;             minSurplus = len - needLength;         }     }      return totalLen; }  int main() {     int *result = 0;     int length = 0;     int i;      _material[0][0] = 28;     _material[0][1] = 2;     _material[1][0] = 49;     _material[1][1] = 3;     _material[2][0] = 55;     _material[2][1] = 4;      _num_material = 3;      ComputeMaxNumNeeded(115);      result = (int *)malloc(sizeof(int)*_num_material);     length = MinSurplus(_material, _num_material, 115, result);      printf("%d\n", length);     for (i = 0; i < _num_material; ++i)         printf("%d ", result[i]);     printf("\n");      free(result);      return 0; }

user: user-3
content: 引用 3 楼 kuangbao9 的回复:[quote=引用 2 楼 jianwen0529 的回复:] 你这个数据量很少，遍历所有情况，选择剩余少的那种情况就可以了，很小的一个算法。  现在只有28米=2支 ，49米=3支 ，55米=4支这三种，那要是每次种类都不一样呢？这个该怎么去写一个函数遍历呢？[/quote] 一楼已经给出代码了 28米=2支 ，49米=3支 ，55米=4支 分别有3 4 5种选择（不选也是一种选择）（例如28m线，不取，取一根，取两根） 设x为记录剩余的长度，可以初始化为55或者更大（因为最佳情况不可能剩余超过或等于55m，用于后续的比较） 组合所有情况，当不满足115m需求则舍弃该种组合。当满足时，记录此种选择并跟之前比较是不是剩余更少。 最后，剩余最少的就是最佳组合了。

user: user-4
content: #include <stdio.h> int main() { 	//28米=2支 ，49米=3支 ，55米=4支 //。实际用的整条线为115 	int i,j,k,min=115,p; 	int x,y,z; 	for(i=0;i<=2;i++) 	    for(j=0;j<=3;j++) 	         for(k=0;k<=4;k++) 	         { 	              p=28*i+49*j+55*k-115; 	              if(p>=0&&p<min) 	              { 	                  min=p; 	                  x=i;y=j;z=k; 	              }   	         } 	     printf("%d %d %d min=%d\n",x,y,z,min);         	     return 0;    }

user: user-2
content: 引用 2 楼 jianwen0529 的回复:你这个数据量很少，遍历所有情况，选择剩余少的那种情况就可以了，很小的一个算法。  现在只有28米=2支 ，49米=3支 ，55米=4支这三种，那要是每次种类都不一样呢？这个该怎么去写一个函数遍历呢？

user: user-3
content: 你这个数据量很少，遍历所有情况，选择剩余少的那种情况就可以了，很小的一个算法。