1661.最小重量机
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
设某一机器由n个部件组成,部件编号为1n,每一种部件都可以从m个供应商处购得,供应商编号为1m。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。对于给定的机器部件重量和机器部件价格,计算总价格不超过cost的最小重量机
器设计,可以在同一个供应商处购得多个部件。
输入
第1行输入3个整数n、m、cost,接下来n行输入wij(每行m个整数),最后n行输入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 <stdio.h>
#include <stdlib.h>
void GetData(int n,int m);
void Machine(int k);
void PrintRes(int n);
typedef struct {
int SellerWeight[100];
int SellerPrice[100];
}Component;
Component cpt[100];
int Num_Comp,Num_Sell,MaxCost; //零件个数/销售商个数/cost上限
int TMPSelectedSeller[100];
int SelectedSeller[100];
int Lowest_wi=100000;
int Cur_cost=0,Cur_weight=0;
int main(void){
scanf("%d %d %d",&Num_Comp,&Num_Sell,&MaxCost);
GetData(Num_Comp,Num_Sell);
Machine(1);
PrintRes(Num_Comp);
return 0;
}
void Machine(int k){
if(k>Num_Comp){
if(Cur_weight<Lowest_wi){
Lowest_wi=Cur_weight;
for(int i=1;i<=Num_Comp;i++){
SelectedSeller[i]=TMPSelectedSeller[i];
}
}
}
else{
for(int i=1;i<=Num_Sell;i++){
Cur_cost+=cpt[k].SellerPrice[i];
Cur_weight+=cpt[k].SellerWeight[i];
TMPSelectedSeller[k]=i;
if(Cur_cost<=MaxCost && Cur_weight<=Lowest_wi){
Machine(k+1);
}
Cur_cost-=cpt[k].SellerPrice[i];
Cur_weight-=cpt[k].SellerWeight[i];
}
}
}
void GetData(int n,int m){
int i=1,j=1;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%d",&cpt[i].SellerWeight[j]);
}
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%d",&cpt[i].SellerPrice[j]);
}
}
}
void PrintRes(int n){
for(int i=1;i<=n-1;i++){
printf("%d ",SelectedSeller[i]);
}
printf("%d\n",SelectedSeller[i]);
printf("%d\n",Lowest_wi);
}