#include<iostream>
using namespace std;
int main(){
int c[20][20],
i,j,
min, m, n, b, d, c2, c1, p, q;
int dem[20],sup[20],rf[20],cf[20],sum=0;
cout<<"\n number of Row: ";
cin>>m;
cout<<"\n number of columns: ";
cin>>n;
cout<<"\n Cost: \n"; //matrix
for(i=0;i<m;i++)
{
for(j=0; j<n; j++)
{
cout<<" Cost Matrix : "<<(i+1)<<(j+1);
cin>>c[i][j];
}
}
cout<<"\n Demand: \n";
for(i=0; i<n; i++){
cout<<" Demand [ : "<<(i+1);
cin>>dem[i];
}
cout<<"\n Supply: \n";
for(i=0; i<m; i++){ //
cout<<" Supply : "<<(i+1);
cin>>sup[i];
}
cout<<"\n Matrix:\n";
for(i=0; i<m; i++){
for(j=0; j<n; j++)
cout<<" %d | "<<c[i][j];
cout<<"%d "<<sup[i];
cout<<"\n";
}
for(j=0; j<n; j++)
cout<<"%d "<<dem[j];
for(i=0; i<m; i++)
rf[i]=0;
for(i=0; i<n; i++)
cf[i]=0;
b=m;
d=n;
while(b>0 && d>0)
{ min=1000;
for(i=0; i<m; i++)
{ if(rf[i]!=1)
{ for(j=0; j<n; j++)
{ if(cf[j]!=1)
{ if(min>c[i][j])
{ min=c[i][j];
p=i;
q=j;
}
}
}
}
}
if(sup[p] < dem[q])
c1=sup[p];
else
c1=dem[q];
for(i=0; i<m; i++)
{ if(rf[i]!=1)
{ for(j=0; j<n; j++)
{ if(cf[j]!=1)
{ if(min==c[i][j])
{ if(sup[i]<dem[j])
c2=sup[i];
else
c2=dem[j];
if(c2>c1)
{ c1=c2;
p=i;
q=j;
}
}
}
}
}
}
//cout<<"\n %d %d %d ",min,p,q);
if(sup[p]<dem[q])
{ sum+=c[p][q]*sup[p];
dem[q]-=sup[p];
rf[p]=1;
b--;
}
else
if(sup[p]>dem[q])
{ sum=sum+c[p][q]*dem[q];
sup[p]-=dem[q];
cf[q]=1;
d--;
}
else
if(sup[p]==dem[q])
{ sum=sum+c[p][q]*sup[p];
rf[p]=1;
cf[q]=1;
b--;
d--;
}
//cout<<"\n %d",sum);
}
cout<<"\n\n total cost %d\n\n"<<sum;
system("pause");
}
此代码用于成本最低的方法。我不明白rf[i]
和cf[i]
的工作是什么,为什么rf[i]!=1
最低成本方法步骤:
确定运输表所有行中的最低成本。
标识行并在单元格中分配对应于行中最低成本的最大可行数量。然后在进行分配时消除该行(列)。
对减少的运输表重复步骤1和2,直到所有可用数量分配到所需位置。如果最低成本不是唯一的,那么可以任意打破平局。
两张图片中的示例: first table
按最低成本法分配的成本为35 x 5 + 35 x 7 + 30 x 4 + 7 x 7 + 43 x 7 = 890
答案 0 :(得分:0)
这意味着如果rf [i] = 0是假的。
rf [p] = 1平均行为true或无法在此代码中运行 所以该行被删除。理解??