/* SUBSET-SUM問題を解く動的計画法のアルゴリズム */ #include #define N 100 /* 配列Aの最大サイズ */ #define B 10000 /* 係数b+1の最大サイズ */ enum yn {yes, no}; /* 列挙型データynの定義 */ enum yn dpssum(int *a, int b, int n); /* 関数の宣言 */ main() /* Solve the subset sum problem for array a[0,...,n-1] and b. */ { int a[N], b; int n, j; FILE *file; file=fopen("ssumdata", "r"); fscanf(file, "%d", &n); if(n>N) { printf("Illegal array size n = %d for N = %d\n", n, N); exit(); } printf("n = %d\na = ", n); for(j=0; j=B) { printf("Illegal size b = %d for B = %d\n", b, B); exit(); } printf("b = %d\n", b); if(dpssum(a, b, n)==yes) printf("Yes\n"); else printf("No\n"); } enum yn dpssum(int *a, int b, int n) /* 係数a[0],...,a[n-1],bに対しSUBSET-SUM問題の解の存在判定 */ { int y[N][B]; /* 動的計画法の計算表 */ int k, p; for(k=0; k=0 && y[k-1][p-a[k]]==1) y[k][p]=1; } if(y[n-1][b]==1) return(yes); /* 結果 */ else return(no); }