min{max(i,T[i][n]}即為最短處理時間。
源代碼如下:
#include<stdio.h>
#include<stdlib.h>
int T[2000]={0};
int main()
{
int n;
int i,j,k,sa=0,sb=0,min=100000000;
int A[201],B[201],x=0;
FILE *fp;
fp=fopen("sched8.in","r");
fscanf(fp,"%d",&n);
for(i=1;i<=n;i++)
{
fscanf(fp,"%d",&A[i]);
sa+=A[i];
}
for(i=1;i<=n;i++)
{
fscanf(fp,"%d",&B[i]);
sb+=B[i];
}
for(k=1;k<=n;k++)
{
for(i=sa;i>=0;i--)
{
if(i>=A[k])
{
T[i]=T[i-A[k]]<T[i]+B[k]?T[i-A[k]]:T[i]+B[k];
}
else
T[i]=T[i]+B[k];
}
}
for(i=0;i<=sa;i++)
{
k=i>T[i]?i:T[i];
if(k<min)
min=k;
}
printf("%d",min);
system("pause");
return 0;
}
因為填第k列時,只依賴於第k-1列,可以再壓縮成壹維空間。
源代碼:
#include<stdio.h>
#include<stdlib.h>
char T[2000][2000][201]={0};
int main()
{
int n;
int i,j,k,sa=0,sb=0,min=100000000;
int A[201],B[201];
FILE *fp;
fp=fopen("sched10.in","r");
fscanf(fp,"%d",&n);
for(i=1;i<=n;i++)
{
fscanf(fp,"%d",&A[i]);
sa+=A[i];
}
for(i=1;i<=n;i++)
{
fscanf(fp,"%d",&B[i]);
sb+=B[i];
}
T[0][0][0]=1;
for(k=1;k<=n;k++)
{
for(i=0;i<=sa;i++)
{
for(j=0;j<=sb;j++)
{
if(i>=A[k]&&T[i-A[k]][j][k-1]==1)
T[i][j][k]=1;
if(j>=B[k]&&T[i][j-B[k]][k-1]==1)
T[i][j][k]=1;
}
}
}
for(i=0;i<=sa;i++)
{
for(j=0;j<=sb;j++)
{
if(T[i][j][n]==1)
{
k=i>j?i:j;
if(k<min)
min=k;
}
}
}
printf("%d",min);
system("pause");
return 0;
}