1. 程式人生 > 實用技巧 >201403-5 任務排程

201403-5 任務排程

不kui呀,哭了

實現

#include <algorithm>
#include <cstdio>

#define MAXN 41

using namespace std;
int a[MAXN][4];
int num;
short f[600][600][100];

struct nod{
    int idx,x,y,z;
    nod(){}
    nod(int idx,int x,int y,int z):idx(idx),x(x),y(y),z(z){}
};
nod s[200];
int dfs(){
    int h=0;
    s[h++]=nod(0,0,0,0);
    f[0][0][0]=-1;
    short i;
	int x,y,z;
    int ans=23333333;
    while(h!=0){
        nod t=s[--h];
        i=t.idx,x=t.x,y=t.y,z=t.z;
        
		if(f[x][y][z]>=i) {
			continue;  //如果該狀態可以執行的任務數不少於接下來要列舉的任務數就放棄該次列舉
        }
        
		f[x][y][z]=i;
        
        i++;
        int v=max(x,max(y,z));
        if(v>ans) {
        	continue;
		}
        if(i==num+1) {
			ans=min(ans,v);
			continue;
		}
		s[h++] = nod(i,x+a[i][0],y,z);
		s[h++] = nod(i,x,y+a[i][0],z);
		s[h++] = nod(i,x+a[i][2],y,z+a[i][2]);
		s[h++] = nod(i,x,y+a[i][2],z+a[i][2]);
		if (a[i][1] > a[i][3]) {
			s[h++] = nod(i,x+a[i][3],y+a[i][3],z+a[i][3]);	
		} else {
			s[h++] = nod(i,x+a[i][1],y+a[i][1],z);		
		}		
    }
    return ans;
}
int main(){
    scanf("%d",&num);
    for(int i=1;i<=num;i++)
    {
        for(int j=0;j<4;j++) {
			scanf("%d",&a[i][j]);        	
		}
        if(a[i][1]>a[i][3]) {
        	a[i][1]=a[i][3];	
		}
    }
    printf("%d\n",dfs());
    return 0;
}

參考

https://bbs.csdn.net/topics/392049388

https://www.cnblogs.com/meowmeowmeow/p/7590169.html