洗袜子捞捞

第五章实验报告_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. 你对回溯算法的理解

对于树的深度优先遍历法则,探索所有可行解,有点枚举的意思,如果只有限界条件,而不去剪枝,时间复杂度通常会是指数型的,但剪枝策略容易想的一般去掉的结果不多,难想的是真的难想,也难以实现.总的来说是一种既暴力又需要细心的方法

posted on 2021-12-10 00:28  洗袜子捞捞  阅读(30)  评论(0编辑  收藏  举报