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

问题描述:

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

代码:

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <iostream>
 4 using namespace std;
 5 const int maxn=100;
 6 
 7 int w[maxn][maxn];
 8 int c[maxn][maxn];
 9 int best[maxn];
10 int b[maxn];
11 int n,m,d;
12 int mi=0x3f3f3f3f;
13 int cost=0;
14 int wei=0;
15 
16 void f(int num)
17 {
18     if(n==num)
19     {
20         if(wei<mi)
21         {
22             mi=wei;
23             for(int i=0;i<n;i++)
24                 best[i]=b[i]+1;
25         }
26         return ;
27     }
28     
29     for(int i=0;i<m;i++)
30     {
31         cost+=c[num][i];
32         wei+=w[num][i];
33         b[num]=i;
34         if(cost<=d && wei<mi)
35             f(num+1);
36         cost-=c[num][i];
37         wei-=w[num][i];
38     }
39     
40 }
41 
42 int main()
43 {
44     cin>>n>>m>>d;
45     for(int i=0;i<n;i++)
46         for(int j=0;j<m;j++)
47             cin>>c[i][j];
48     for(int i=0;i<n;i++)
49         for(int j=0;j<m;j++)
50             cin>>w[i][j];
51     f(0);
52     cout<<mi<<endl;
53     for(int i=0;i<n;i++)
54         cout<<best[i]<<" ";
55     cout<<endl;
56     
57 }

输入示例:

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

猜你喜欢

转载自www.cnblogs.com/wangxuelin/p/9035320.html