如何材料最省,这个需要慢慢计算的,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)); }
{
L100 = 100,
L200 = 200,
L300 = 300
} void Fun( )
{
string[] names = Enum.GetNames(typeof(Length));
int[] lengths = (int[])Enum.GetValues(typeof(Length)); }
伪代码如下:
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次后,才结束递归循环。
是的,你说的很对,可我需要再详细一点的代码,每种切割模式用string来保存,可以debug出来的更好.
因为那个切割的规格,也是一个变量,最小是3,最大是6,能不能帮我写下...
下面这个校验过了.
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();
}
}