如何材料最省,这个需要慢慢计算的,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));        }

解决方案 »

  1.   

    切割模式很简单,对于只能切三种长度,这意味着需要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次后,才结束递归循环。
      

  2.   


    是的,你说的很对,可我需要再详细一点的代码,每种切割模式用string来保存,可以debug出来的更好.
    因为那个切割的规格,也是一个变量,最小是3,最大是6,能不能帮我写下...
      

  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;//没有被切割出的规格数
    int minValue=int.MaxValue;
    for(int j=0;j<nc.Length;j++){
    if(nc[j]==0)count0++;
    used+=nc[j]*n[j];
    result+=nc[j]+",";
    if(minValue > n[j]) minValue = n[j];
    }
    if(used > max){
    return;
    }else{
    if(count0 >= n.Length-m && //已切割规格数不能超过切割规格数最大限制
    used+minValue > max){//剩余材料如果能切割需继续切割
    System.Console.WriteLine(result.Substring(0,result.Length-1));
    }
    }
    }
    nc[index]++;
    }
    }

    public static void Main(){
    Cut C=(new Cut());
    C.find();
    }
    }