标签:i++ ack backtrack clu printf class 结束 std 表示
/*最小重量机器问题*/ #include<stdio.h> 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() { int i,j; printf("请输入部件数:\n"); scanf("%d",&n); printf("请输入供应商数:\n"); scanf("%d",&m); printf("请输入限定价格:\n"); scanf("%d",&cost); printf("请输入各部件在不同供应商的重量:\n"); for(i=1; i<=n; i++) for(j=1; j<=m; j++) scanf("%d",&w[i][j]); printf("请输入各部件在不同供应商的价格:\n"); for(i=1; i<=n; i++) for(j=1; j<=m; j++) scanf("%d",&c[i][j]); Backtrack(1); printf("每个部件的供应商:\n"); for(i=1;i<=n;i++) printf("%d ",bestx[i]); printf("\n"); printf("所有部件的最小重量:\n"); printf("%d ",bestw); printf("\n"); return 0; }
标签:i++ ack backtrack clu printf class 结束 std 表示
原文地址:https://www.cnblogs.com/zili/p/9906521.html