回朔法 - 求解最小机器重量设计问题

题目

 

设某一机器由n个部件组成,部件编号为1~n,每一种部件都可以从m个供应商处购得,供应商编号为1~m。设w[i][j]是从供应商j处购得的部件i的重量,c[i][j]是相应的价格。对于给定的机器部件重量和机器部件的价格,计算总价不超过cost的最小重量机器设计,要求在同一个供应商处最多只购得一个部件。

输入描述

第1行输入3个整数,n、m、cost,接下来n行输入w[i][j](每行m个整数),最后n行输入c[i][j](每行m个整数),1<=n,m<=100。

输出描述

输出的第一行包括n个整数,表示每个对应的供应商编号,第2行为对应的重量。

输入样例

3 3 7

1 2 3

3 2 1

2 3 2

1 2 3

5 4 2

2 1 2

输出样例

1 3 1

4

代码

#include<iostream>
#include<stdio.h>

using namespace std;

int w[100][100];//w[i][j]为第i个零件在第j个供应商的重量
int c[100][100];//c[i][j]为第i个零件在第j个供应商的价格
int bestx[100];//bestx[i]表示一次搜索到底后的最优解,用来存放第i个零件的供应商,
int x[100];//x[i]临时存放第i个零件的供应商
int cw = 0, cc = 0, bestw = 10000;
int cost;//限定价格
int n;//部件数
int m;//供应商数

void Backtrack(int t)
{
    int j;
    if (t > n)//搜索到叶子结点,一个搜索结束,所有零件已经找完
    {
        bestw = cw;//当前最小重量
        for (j = 1; j <= n; j++)
            bestx[j] = x[j];
    }
    else
    {
        for (j = 1; j <= m; j++)
        {
            if (cc + c[t][j] <= cost && cw + w[t][j] < bestw)
            {
                x[t] = j;
                cc += c[t][j];
                cw += w[t][j];
                Backtrack(t + 1);
                cc -= c[t][j];
                cw -= w[t][j];
            }
        }
    }
}

int main()
{
    //cout << "-----------------------------------" << endl;
    int i, j;
    //cout << "请输入部件数:";
    cin >> n;
    //cout << endl << "请输入供应商数:";
    cin >> m;
    //cout << endl << "请输入限定价格:";
    cin >> cost;
    //cout << endl << "-----------------------------------" << endl;

    //cout << "请输入各部件的在不同供应商的重量:" << endl;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            cin >> w[i][j];
            // cout << "w[" << i << "][" << j << "] = " << w[i][j] << endl;
        }
        cout << endl;
    }

    //cout << endl << "-----------------------------------" << endl;

    //cout << "请输入各部件的在不同供应商的价格:" << endl;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            cin >> c[i][j];
            // cout << "c[" << i << "][" << j << "] = " << c[i][j] << endl;
        }
        cout << endl;
    }

    
    Backtrack(1);
    //cout << "每个部件的供应商:" << endl;
    //cout << endl << "-----------------------------------" << endl;
    for (i = 1; i <= n; i++)
        cout << bestx[i] << ' ';
    cout << endl;
    cout << bestw;
    cout << endl;
    system("pause");
    return 0;
}

以下为我的微信公众号:技术经理的成长

会不定期进行更新,欢迎关注

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
利用Java编写的几种经典问题算法: 1.设a[0:n-1]是一个有n个元素的数组,k(0<=k<=n-1)是一个非负整数。 试设计一个算法将子数组a[0:k]与a[k+1,n-1]换位。要求算法在最坏情况下耗时O(n),且只用到O(1)的辅助空间。 2.在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分,并分析算法的计算复杂性。 3.设磁盘上有n个文件f1,f2,…,fn,每个文件占用磁盘上的1个磁道。这n个文件的检索概率分别是p1,p2,…,pn,且 =1。磁头从当前磁道移到被检信息磁道所需的时间可用这2个磁道之间的径向距离来度量。如果文件fi存放在第i道上,1≦i≦n,则检索这n个文件的期望时间是对于所有的i<j,time+=pi*pj*d(i,j) 。其中d(i,j)是第i道与第j道之间的径向距离|i-j|。磁盘文件的最优存储问题要求确定这n个文件在磁盘上的存储位置,使期望检索时间达到最小。试设计一个解决此问题算法,并分析算法的正确性与计算复杂度。 4.最小重量机器设计问题设某机器由n个部件组成,每一种部件可以从m个不同的供应商处购得。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。试设计一个算法,给出总价格不超过c的最小重量机器设计
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小爱玄策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值