1.25 最佳调度问题

这题可以贪心或者搜索,搜索更为简单,便于理解。

首先考虑怎么记录各个机器的工作情况,我们不妨设一个sum数组表示第i台机器工作的时间,这样只需要枚举每一次的工作给第几台机器就可以完成搜索

最后数组里最大的就是所需时间

但是显然这样会有非常多的重复计算,时间会超,这时候就需要剪枝

首先再传一个参数记录最大值,省去最后的枚举

再在递归时判断最大值是否大于等于答案,如果已经超出答案,没有必要继续

最后也是最坑的,在输入数据后,搜索前,将工作时间按降序排序,这样搜索从大的开始,可以提前结束(有一点点贪心的意思)

附上代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 1005;
int n,k,ans=1e9,a[N],vis[N],sum[N];
void dfs(int cur,int m){
    if(m >= ans)return ;
    if(cur == n+1){
         
        //printf("m=%d\n",m);
        ans = min(m,ans);
        return ;
    }
    for(int i=1;i<=k;++i){
        sum[i] += a[cur];
        if(sum[i] > ans){
            sum[i] -= a[cur];
            continue;
        }
        dfs(cur+1,max(sum[i],m));
        
        sum[i] -= a[cur];
    }
}
bool cmp(int x,int y){
    return x > y;
}
signed main(){

    scanf("%d%d",&n,&k);
    for(int x,i=1;i<=n;++i){
        scanf("%d",&a[i]);
    }
    sort(a+1,a+1+n,cmp);
    dfs(1,-1e9);
    printf("%d",ans);
}
/*
7 3
2 14 4 16 6 5 3
*/

 

posted @ 2022-01-27 12:38  Xu_brezza  阅读(45)  评论(0编辑  收藏  举报