算法分析与设计第五章例题

本文深入探讨了算法分析与设计中的装载问题,包括递归迭代回溯和非递归迭代回溯两种解决策略。同时,还涉及01背包问题、最大团问题、m的着色问题、旅行售货员问题以及圆排列和连续邮资问题的求解,附带相关参考代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.2 装载问题:
1递归迭代回溯:

#include <iostream>
#include <bits/stdc++.h>
#include <queue>
#include <stack>
#include <string>
#include <math.h>
#define inf 0x3f3f3f3f
#define maxn 200050
using namespace std;
// 5.2 装载问题
int best_w = 0;
int ans[101];
int w[101];
int x[101];
int n;
int c1,c2;
int pre_w;
int r;

// 递归迭代回溯方式
void back_(int index)
{
   
   
     if(index > n)
     {
   
   
         if(best_w < pre_w)
         {
   
   
             best_w = pre_w;
             for(int i=1; i<=n;i++)
             {
   
   
                 ans[i] = x[i];
             }
         }
         return ;
     }
     r -= w[index];
     if(pre_w + w[index] <= c1)
     {
   
   
         x[index] = 1;
         pre_w += w[index];
         back_(index+1);
         pre_w -= w[index];
         
     }
     if(pre_w + r > best_w)
     {
   
   
        x[index] = 0;
        back_(index+1);
     }
     r += w[index];

    

}
int main()
{
   
   
    cin>>n;
    r = 0;
    cin>>c1>>c2;
    for(int i=1; i<=n; i++)
    {
   
   
        cin>>w[i];
        r += w[i];
    }
    memset(ans,0,sizeof(ans));
    back_(1);

    for(int i=1; i<=n; i++)
    {
   
   
        if(ans[i])
        {
   
   
            cout<<w[i]<<endl;
        }
    }
}

2非递归迭代回溯:

#include <iostream>
#include <bits/stdc++.h>
#include <queue>
#include <stack>
#include <string>
#include <math.h>
#define inf 0x3f3f3f3f
#define maxn 200050
using namespace std;
// 5.2 装载问题
int best_w = 0;
int ans[101];
int w[101];

int n;
int c1,c2;
int pre_w;
int r;

// 非递归迭代回溯方式
int best_back()
{
   
   
    
    int i = 1;
    int *x = new int[n+1];  //动态开辟数组空间
    while(true)//搜索子树  
    {
   
          
        
        while(i<=n && pre_w + w[i] <= c1)    //左子树
        {
   
   
            
             r -= w[i];
             x[i] = 1;
             pre_w += w[i];
             i++;
        }
        if(i > n)                           //叶子节点
        {
   
   
                for(int j=1; j<=n; j++)
                {
   
   
                    ans[j] = x[j];

                }
                best_w = pre_w;

            
        }
        else                              //右子树
        {
   
   
            r -= w[i];
            x[i] = 0;
            i++;
        }
         while(pre_w + r <= best_w)       //剪枝+回溯
        {
   
   
            i--;
            while(x>0 && !x[i])
            {
   
   
                r += w[i];
                i--;
            }
            if( i == 0)
            {
   
   
                delete[] x;
                return best_w;
            }
            x[i] = 0;
            pre_w -= w[i];
            i++;

        }


    }
}
int main()
{
   
   
    cin>>n;
    cin>>c1>>c2;
    r = 0;
    pre_w = 0;
    best_w = 0;
   
    for(int i=1; i<=n; i++)
    {
   
   
        cin>>w[i];
        r += w[i];
    }
   
    cout<<best_back()<<endl;
    
    for(int i=1; i<=n; i++)
    {
   
   
        if(ans[i])
        {
   
   
            cout<<w[i]<<endl;
        }
    }
    return 0;
}

5.3

#include <iostream>
#include <bits/stdc++.h>
#include <queue>
#include <stack>
#include <string>
#include <math.h>
#define inf 0x3f3f3f3f
#define maxn 200050
using namespace std;
// 5.3 批处理作业调度
int f;   // 全排列每次完成时间和
int f1; // 机器1处理时间
int f2[101]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值