// JobSchedule.cpp : 定义控制台应用程序的入口点。
//
//t=T-sum(ai)=sum(bi)+sum(si)-sum(ai),as sum(si)>=0,so t>=sum(bi)-sum(ai); as sum(si)#include \"stdafx.h\"void MinSchTime(int *a,int *b,int n,int *T,int m,int t,int *solution)
{
unsigned int s=0,max=1;
int i=0;
for(;ifor(i=0;ifor(i=0;ifor(i=1;i<=n;i++){
for(s=1;s{int len=0;
for(int tmp=s;tmp>0;tmp/=2)
if(tmp%2)len++;
if(len!=i){
s++;
continue;
}
////////////////////////////////
for(int l=0;l{//T(S,l)unsigned int s2=s,minum=0xffffffff,bestj=-1;
for(int j=0;s2>0;j++)
{
if(s2%2)//第j位为1
{
int sub=1;
for(int k=1;k<=j;k++)sub*=2;
int s3=s-sub;
int ss=l-a[j];
unsigned int tt=a[j]+T[s3*t+b[j]+(l-a[j]>0?l-a[j]:0)];
if(minum>tt)
{
minum=tt;
bestj=j;
}
}
s2/=2;
}
T[s*t+l]=minum;
solution[(i-1)*t+l]=bestj;
}
s++;
}
}
}
int c(int m,int n)
{
int t=1,i=1;
for(;i<=n;i++)t*=i;
int b1=1,b2=1;
for(i=1;i<=m;i++)b1*=i;
for(i=1;i<=n-m;i++)b2*=i;
return t/(b1*b2);
}
void PrintSolution(unsigned int s,int l,int t,int * a,int *b,int *solution)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
int count=0;
printf(\"Please input job count:\");
scanf(\"%d\
int *a=new int[count*2];
int *b=a+count;
memset(a,0,count*2);
printf(\"Please input all a and b:\\n\");
int i=0;
for(;i{printf(\"Job%d:\
scanf(\"%d\
scanf(\"%d\
}
int m=0,t=0;
for(i=0;i<=count;i++)
m+=c(i,count);
for(i=0;iint *T=new int[m*t];int *solution=new int[count*t];
MinSchTime(a,b,count,T,m,t,solution);
printf(\"The min time is:%d\\n\
return 0;
}