201403-5 任務排程
阿新 • • 發佈:2020-08-19
不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; }