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 */