第五章实验报告_Gdufs_CGX
1. 请用回溯法的方法分析“最小重量机器设计问题”
0-1背包问题反过来而已, 价值有限的情况下,物品重量尽可能的小
1.1 说明“最小重量机器设计问题"的解空间
n个零件,m个厂商
1.2 说明 “最小重量机器设计问题"的解空间树
n个零件为树的深度,m个厂商则为叶子结点,每次拿完所有零件后记录一次最小重量
1.3 在遍历解空间树的过程中,每个结点的状态值是什么
当前背包的价值以及重量
#include<iostream>
using namespace std;
int producer,elem,maxprice,value[100][100],weight[100][100],bestprocess[100],sumvalue=0,sumweight=0,minweight=100000,process[100];//elem物品数,producer厂商数,process记录最佳情况
void backtrack(int t)
{
int i;
if(t>elem)
{
if(sumweight < minweight)
{
minweight=sumweight;
for(i=1;i<=elem;i++)
{
bestprocess[i]=process[i];
}
}
return;
}
for( i=1;i<=producer;i++)
{
if(sumvalue+value[t][i] <= maxprice && sumweight+weight[t][i] <= minweight)//左边限界,右边剪枝
{
process[t]=i;
sumweight+=weight[t][i];
sumvalue+=value[t][i];
backtrack(t+1);
sumweight-=weight[t][i];
sumvalue-=value[t][i];
}
}
}
int main()
{
cin >> elem >> producer >> maxprice;
int i,j;
for(i=1;i<=elem;i++)
{
for(j=1;j<=producer;j++)
{
cin>>value[i][j];
}
}
for(i=1;i<=elem;i++)
{
for(j=1;j<=producer;j++)
{
cin>>weight[i][j];
}
}
backtrack(1);
cout<<minweight<<endl;
for(i=1;i<=elem;i++)
{
cout<<bestprocess[i]<<" ";
}
}
2. 你对回溯算法的理解
对于树的深度优先遍历法则,探索所有可行解,有点枚举的意思,如果只有限界条件,而不去剪枝,时间复杂度通常会是指数型的,但剪枝策略容易想的一般去掉的结果不多,难想的是真的难想,也难以实现.总的来说是一种既暴力又需要细心的方法