-2
#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
C++中最低成本法的部分說明
最經濟的方法步驟:
確定運輸表的所有行中最少的成本。
確定行並在單元格中分配行中最小成本對應的最大可行數量。然後在分配時刪除該行(列)。
對於減少的運輸表重複步驟1和2,直到將所有可用數量分配到所需位置。如果最低成本不是唯一的,則可以任意打破平局。
例如在兩個圖片: first table
分配的通過最少的成本方法的成本是35×5 + 35×7 + 30×4 + 7×7 + 43 x 7 = 890