最小重量机器设计问题(回溯法)

#include <bits/stdc++.h>
#include <stdio.h>
using namespace std;
#define maxn 1000
int n;//部件个数
int m;//供货商个数
int max_c;//最大价格

int w[maxn][maxn];//价格
int c[maxn][maxn];//费用

int cc;//当前价格
int cw;//当前重量
int bestw=0x3f3f3f;//最小重量
int bestx[maxn];//最优解向量
int x[maxn];//当前解向量

void BackTrack(int t)
{
    if(t==n)//到达最后一层
    {
        for(int i=1; i<=m; i++)//遍历所有叶子节点
        {
            cw+=w[t][i];
            cc+=c[t][i];
            x[t]=i;
            if(cc<=max_c&&cw<bestw)//若费用不超过最大费用并且重量小于之前的最优解
            {
                //更新最优解
                bestw=cw;
                for(int j=1; j<=n; j++)
                    bestx[j]=x[j];
            }
            cc-=c[t][i];//返回上一层
            cw-=w[t][i];
            x[t]=0;
        }
    }
    else//未到达最后一层
    {
        for(int i=1; i<=m; i++)//遍历该层节点
        {
            x[t]=i;
            cw+=w[t][i];
            cc+=c[t][i];
            if(cc<max_c&&cw<bestw)//费用小于最小费用重量小于最优解时进入下一层
            {
                BackTrack(t+1);
            }
            cc-=c[t][i];//返回上一层
            cw-=w[t][i];
            x[t]=0;

        }
    }
}

int main()
{
    cout<<"输入部件数量 供应商个数 最大费用:"<<endl;
    cin>>n>>m>>max_c;

    cout<<"依次输入第i个部件第j个供应商所需要的费用:"<<endl;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cin>>c[i][j];
        }
    }
    cout<<"依次输入第i个部件第j个供应商所售部件的的重量:"<<endl;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cin>>w[i][j];
        }
    }
    BackTrack(1);
    cout<<endl<<"最小重量为:"<<endl;
    cout<<bestw<<endl;
    cout<<"提供每个部件的供应商:"<<endl;
    for(int i=1; i<=n; i++)
    {
        cout<<bestx[i]<<" ";
    }
}
/*
3 3 4
1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
*/

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值