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;
}

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...