#include <iostream> using namespace std; #define MAX 99999 class LightMachine { private: int n;//n个部件 int m;//m个供应商 int **weight;//weight[i][j]表示j供应商提供的第i个部件的重量 int **price;//price[i][j]表示j供应商提供的第i个部件的价格 int maxPrice;//限制机器总价值不得超过maxPrice int minWeight;//表示价值不超过maxPrice的情况下能够达到的最小重量 int tempW;//用于记录回溯过程中的临时重量 int tempP;//用于记录回溯过程中的临时价值 int *x;//x[1:n]记录1...n个部件的选择厂商 int *bestX;//bestX[1:n]记录取得minWeight时1....n个部件的选择厂商 public: //构造函数 LightMachine(int n,int m,int maxPrice) { this->n=n; this->m=m; this->maxPrice=maxPrice; minWeight=MAX; tempW=0; tempP=0; x=new int[1+n];//x[1:n] bestX=new int[1+n];// bestX[1:n] weight=new int* [1+n]; price=new int* [1+n]; for(int i=0;i<=n;i++) { weight[i]=new int[m+1]; price[i]=new int[m+1]; } } //输入供应信息 void input() { cout<<"根据提示输入零件的价格与重量"<<endl; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cout<<"请输入第"<<i<<"个零件由第"<<j<<"个供应商供应的价格:"; cin>>price[i][j]; cout<<"请输入第"<<i<<"个零件由第"<<j<<"个供应商供应的重量:"; cin>>weight[i][j]; } } } //回溯核心算法 void getMinWeight(int i) { if(i>n) { if(tempW<minWeight) { minWeight=tempW; for(int j=1;j<=n;j++) { bestX[j]=x[j]; } } return; } for(int k=1;k<=m;k++) { x[i]=k; if(tempW+weight[i][x[i]]<minWeight&&tempP+tempP+price[i][x[i]]<=maxPrice)//如果之前的重量+当前i零件选择的重量小于最小重量并且之前价值+i零件选择的价值小于等于最大允许价值 { tempW+=weight[i][x[i]]; tempP+=price[i][x[i]]; getMinWeight(i+1); //恢复现场 tempW-=weight[i][x[i]]; tempP-=price[i][x[i]]; } } } //调用回溯算法,并打印结果 void doGetMinWeight() { getMinWeight(1); //打印结果 for(int i=1;i<=n;i++) { cout<<"第"<<i<<"个零件选择了厂商:"<<bestX[i]<<endl; } cout<<"机器最小重量为:"<<minWeight<<endl; } }; void main() { LightMachine test(5,4,40);//5个零件,4个供应商,最大价值40 test.input(); test.doGetMinWeight(); }