***东北师范大学算法课在线习题11月18日***
Problem Description
设某一机器由n个部件组成,部件编号为1-n,每一种部件都可以从m个供应商处购得,供应商编号为1-m。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。对于给定的机器部件重量和机器部件价格,计算总价格不超过cost的最小重量机器设计,可以在同一个供应商处购得多个部件。
Input
第1行输入3个整数n、m、cost,接下来n行输入wij(每行m个整数)最后n行输入cij(每行m个整数),这里1<=n、m<=100
Output
输出的第1行包括n个整数,表示每个对应的供应商编号,第2行为对应的重量。
Sample Input
3 3 7
1 2 3
3 2 1
2 3 2
1 2 3
5 4 2
2 1 2
Sample Output
1 3 1
4
思想:回溯(su)法固定模板
#include <iostream>
using namespace std;
int n,m,cost;
int w[105][105],c[105][105];
int ans[100],p[100];
int weight,value;
int minweight = 100000;
void dfs(int t)
{
if(t==n+1&&value<=cost)
{
if(weight<minweight)
{
minweight = weight;
for(int j=1;j<=n;j++)
ans[j] = p[j];
}
return;
}
if(value<=cost){
for(int i=1;i<=m;i++)
{
p[t] = i;
weight+=w[t][i];
value +=c[t][i];
dfs(t+1);
p[t] = 0;
weight-=w[t][i];
value -=c[t][i];
}
}
}
int main()
{
cin>>n>>m>>cost;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>w[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>c[i][j];
dfs(1);
for(int i = 1;i<n;i++)
cout<<ans[i]<<' ';
cout<<ans[n]<<endl;
cout<<minweight;
return 0;
}