最小重量机器设计问题

来源:互联网 发布:什么是bp神经网络算法 编辑:程序博客网 时间:2024/06/08 14:26

设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得,设wi是从供应商j处购得的部件i的重量,cij是相应价格。尝试设计一个算法,给出总价格不超过c的最小重量机器设计。

输入:第一行有三个正整数n,m,c,接下来2n行,每行m个数,前n行是c,后n行是w。

输出,将计算的最小重量及每个部件的供应商输。

例子:3 3 4

           1 2 3

            3 2 1

            2 2 2

            1 2 3

            3 2 1

            2 2 2

输出:4

           1 3 1

代码:#include<iostream>
using namespace std;
bool Take(int n,int d,int *x,int **v)//约束条件,当前选入物品价格不超过d
{
int i,vsum=0;
for(i=1;i<n+1;i++)
vsum+=v[i][x[i]];
if(vsum>d)
return 0;
return 1;
}
void Backtrack(int n,int m,int d,int t,int wsum,int &bestw,int *x,int *bestx,int **w,int **v)
{
int i;
if(t>n)
{
if(wsum<bestw)
{
bestw=wsum;
for(i=1;i<n+1;i++)
bestx[i]=x[i];
}


return ;
}
for(i=1;i<n+1;i++)
{
x[t]=i;
wsum+=w[t][i];
if(Take(n,d,x,v))
Backtrack(n,m,d,t+1,wsum,bestw,x,bestx,w,v);
wsum-=w[t][i];
x[t]=0;

}
}
int main()
{
int n,m,d,i,j,wsum=0,bestw=100;
cin>>n>>m>>d;
int **v,**w;
int *x,*bestx;//存放商人序号
v=new int*[n+1];
w=new int*[n+1];
x=new int[n+1];
bestx=new int[n+1];
for(i=0;i<n+1;i++)//建立价值和重量两个二维数组,行数代表商品,列数代表商人
{
v[i]=new int[m+1];
w[i]=new int[m+1];
x[i]=0;
bestx[i]=0;
}
for(i=0;i<n+1;i++)
for(j=0;j<m+1;j++)
if(i==0||j==0)v[i][j]=0;
else cin>>v[i][j];
for(i=0;i<n+1;i++)
for(j=0;j<m+1;j++)
if(i==0||j==0)w[i][j]=0;
else cin>>w[i][j];
    Backtrack(n,m,d,1,wsum,bestw,x,bestx,w,v);
cout<<bestw<<endl;
for(i=1;i<n+1;i++)
cout<<bestx[i]<<" ";
system("pause");
return 0;


}


0 0
原创粉丝点击