UVa 690 - Pipeline Scheduling(回溯剪枝)

前端之家收集整理的这篇文章主要介绍了UVa 690 - Pipeline Scheduling(回溯剪枝)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

首先对枚举所有可能的时间间隔,然后暴力每个工作之后间隔多久进行下一个,当当前时间加上最短间隔乘剩余个数大于最优解时回溯。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 25;
int n,a[5],dt[maxn],ans,cnt;

bool ok(int *p,int k) {
    for(int i = 0; i < 5; ++i)
        if(a[i] &(p[i] >> k)) return false;
    return true;
}

void dfs(int *p,int d,int sum) {
    if(sum + dt[0] * (10 - d) >= ans) return;
    if(d == 10) {ans = min(ans,sum); return; }
    for(int i = 0; i < cnt; ++i) {
        if(ok(p,dt[i])) {
            int p2[5];
            for(int j = 0; j < 5; ++j)
                p2[j] =(p[j] >> dt[i]) | a[j];
            dfs(p2,d+1,sum + dt[i]);
        }
    }
    return;
}

int main() {
    while(~scanf("%d",&n) && n) {
        memset(a,0,sizeof(a));
        memset(dt,sizeof(dt));
        for(int i = 0; i < 5; ++i) {
            char s[maxn]; scanf("%s",s);
            for(int j = 0; j < n; ++j)
                if(s[j] == 'X') a[i] |=(1 << j);
        }
        cnt = 0;
        for(int i = 1; i <= n; ++i)
            if(ok(a,i)) dt[cnt++]=i;
        ans = 10 * n;
        dfs(a,1,n);
        printf("%d\n",ans);
    }
    return 0;
}

猜你在找的设计模式相关文章