日期:2014-05-17  浏览次数:21452 次

求一个枚举的算法
题目:原材料长度为6000,需要切割以下几种长度,分别为:1000,1810,500,800,3000,所需的数量分别为:200,100,150,350,60;
又规定,一根材料上只能切三种规格,(就是一根材料上只能切三种长度);问,怎么切割,所需的原材料总根数最少!


我现在不要最后的结果,我只要先枚举出所有可能的切割模式,我需要这个算法,因为程序里需要切割的长度是不固定的,而限定切割的规格数也不固定,有谁会做的吗?帮帮忙~

------解决方案--------------------
如何材料最省,这个需要慢慢计算的,100分不够的。不过我提供几个方法给你,或有所帮助。

 public enum Length
        {
            L100 = 100,
            L200 = 200,
            L300 = 300
        }

 void Fun( )
        {
            string[] names = Enum.GetNames(typeof(Length));
            int[] lengths = (int[])Enum.GetValues(typeof(Length));

        }
------解决方案--------------------
切割模式很简单,对于只能切三种长度,这意味着需要3次循环,按照从最长的开始循环尝试。
伪代码如下:
for(int x = 0; x<=6000/3000;x++)
{
    var last1 = 6000 - 3000*x; //计算剩余长度
    for(int y=0;y<=last1/ 800;y++)
    {
        var last2 = last1 - 800* y;//计算剩余长度
        for(...)
        {

        }
    }
}

实际操作时必须使用递归来处理循环次数,而不能写死3次循环,因为如果x=0的情况,也就是那个切割方式没被采用,此时那个循环不能算作一次切割,3次限额未使用掉,需要用全局变量记录是否使用了3次限额,只有到了3次后,才结束递归循环。
------解决方案--------------------
递归来切比较现实,先分析出模式,然后再来决定根数。
------解决方案--------------------
这个能算作算法吗?就一个简单的递归运算吧.
下面这个校验过了.
class Cut {
public void find(){
nc=new int[n.Length];
find(0);
}
public int max=6000;//材料长度
public int[] n=new int[]{1000,1810,500,800,3000};//不同规格长度
public int m=3;//最多切割规格数
private int[] nc;//记录各类型切割数量
private void find(int index){
for(int i=0;i<max/n[index]+1;i++){
//切割到最后一种规格数的时候可以判断该方案是否满足条件,否则进入下一种
if(index+1<n.Length){
for(int j=index+1;j<nc.Length;j++){//后面各切割规格数量归零
nc[j]=0;
}
find(index+1);
}else{
string result="";
int used =0;
int count0 = 0;//没有被切割出的规格数