将长度为N的钢管截成长为n1,n2,n3各若干根,求所有可能的组合
2009-03-08 23:09
211 查看
题目来自CSDN论坛:
http://topic.csdn.net/u/20090308/21/4595b675-046c-46e1-8973-8995bd50af05.html?seed=1504879824
有一根钢管需要切割,有几种切割长度。求最省料的切割方法。
比如一根钢管3米,可以切割成0.2米、0.3米、0.4米三种。问怎么样的切割才不会浪费材料。每一种长度的都可以切割任意次。
可以0.2*15可以(0.2*2+0.3*2)*3可以0.3*10,怎么样组合都可以,求一共有多少种组合,要是没有不浪费的方法,那么用最省料的方法,会浪费多少。
http://topic.csdn.net/u/20090308/21/4595b675-046c-46e1-8973-8995bd50af05.html?seed=1504879824
有一根钢管需要切割,有几种切割长度。求最省料的切割方法。
比如一根钢管3米,可以切割成0.2米、0.3米、0.4米三种。问怎么样的切割才不会浪费材料。每一种长度的都可以切割任意次。
可以0.2*15可以(0.2*2+0.3*2)*3可以0.3*10,怎么样组合都可以,求一共有多少种组合,要是没有不浪费的方法,那么用最省料的方法,会浪费多少。
//放大十倍,用整型来计算: static void GetSplit(int totalLength, int[] length) { Array.Sort(length);//先排个序,可以减少循环的次数 int min = totalLength;//最小的被浪费长度 List<string> result = new List<string>();//保存最省料时各长度的数量 for (int i = 0; i <= (int)(totalLength / length[2]); i++) { for (int j = 0; j <= (int)(totalLength / length[1]); j++) { int tempSum = i * length[2] + j * length[1];//计算取前两种长度的数量后,被截去的长度 if (tempSum > totalLength) break; int temp = (int)((totalLength - tempSum) / length[0]);//计算第三个长度能截出的数量 if (totalLength - tempSum - temp * length[0] < min)//检查是否有更省料的可能 { min = totalLength - tempSum - temp * length[0]; result.Clear(); result.Add(temp + "," + j + "," + i); } else if (totalLength - tempSum - temp * length[0] == min) { result.Add(temp + "," + j + "," + i); } } } foreach (string s in result)//输出结果 Console.WriteLine(s); } static void Main(string[] args) { //GetSplit(3.0, new double[] {0.2,0.3,0.4 }); GetSplit(30, new int[] { 2, 3, 4 }); } /*输出结果:(分别是0.2,0.3,0.4的取值) 15,0,0 12,2,0 9,4,0 6,6,0 3,8,0 0,10,0 13,0,1 10,2,1 7,4,1 4,6,1 1,8,1 11,0,2 8,2,2 5,4,2 2,6,2 9,0,3 6,2,3 3,4,3 0,6,3 7,0,4 4,2,4 1,4,4 5,0,5 2,2,5 3,0,6 0,2,6 1,0,7 */
相关文章推荐
- 给定一列字符,生成指定长度的所有可能的组合
- 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
- 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来
- n个布尔变量,打印所有可能的真值组合
- 求正整数n所有可能的和式的组合。
- 字母a-z,数字0-9,现需要其中任意3个作为密码,请输出所有可能组合。
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 一个叫 team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球队,现在四个球队进行比赛,用一条sql 语句显示所有可能的比赛组合.
- 求正整数n所有可能的和式的组合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2
- 给定一个数字字符串,返回数字可能表示的所有可能的字母组合。数字与字母的对应关系和手机按键对应
- 输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。实际上就是一个背包问题
- <仅是自己做笔记。。。系列-13>输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 给定一个数组,求数组中所有元素的可能组合(每个元素只出现一次),使其和等于给定数的解决办法
- 字符串的所有可能组合输出
- DFS 对一系列给定数据 进行深度优先遍历 获得54321的所有可能组合
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来.
- 查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数: (1)该数的十进制表示中有且仅有两个相同的数字位; (2)该数是素数。
- 查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数: (1)该数的十进制表示中有且仅有两个相同的数字位; (2)该数是素数
- 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合出来---经典数据结构第21道
- 有三个非零数,用它们可能组合的所有三位数之和是2886,若把三个数字自大到小排和自小到大排成三位数,差为495。求三数字。