【回溯法】求解最小机器重量设计问题(1

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

输入:第1 行输入3 个整数n、m、cost,接下来n行输入Wij ( 每行m个整数),最后η行输入Cij (每行m个整数),这里1<=n、m<=100 。

输出描述: 输出的第1行包括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>
using namespace std;
 
int n, m, d;
int bestw = 0x3f3f3f3f;     
int w[101][101];        
int c[101][101];
int cw, cv;             
int x[101];           
int y[101];            
 
void BackTrack(int t)
{
    if(t > n)
    {
        if(cv <= d && cw < bestw)
        {
            bestw = cw;
            for(int i = 1; i <= n; i ++)
                x[i] = y[i];                 
        }
    }
    else
    {
        for(int j = 1; j <= m; j ++)
        {
            
            if(w[t][j] + cw <= d)
            {
                y[t] = j;
                cw += w[t][j];
                cv += c[t][j];
                BackTrack(t + 1);              // 回溯
                cw -= w[t][j];
                cv -= c[t][j];
            }
        }
    }
}
 
int main()
{
    scanf("%d %d %d", &n, &m, &d);
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
            scanf("%d", &w[i][j]);
 
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
            scanf("%d", &c[i][j]);
    
    BackTrack(1);
    for(int i = 1; i <= n; i ++)
    {
        printf("%d", x[i]);
        if(i != n)printf(" ");
    }
    puts("");
    printf("%d", bestw);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值