問題文はhttp://www.ioi-jp.org/joi/2010/2011-yo-prob_and_sol/の問題4です。
自分が書いたプログラムで、1~4番目の入力に対しては正しい答えを出せましたが、
最後の入力のみ正しい答えが出せませんでした。
どこが間違っているか教えていただければ幸いです。
よろしくお願いします。
#include <stdio.h>
unsigned long long kazu[100][21]; /*そこからの種類数のキャッシュ*/
unsigned long long kazoe(int*,int,int,int);/*種類を数える関数*/
int main(int argc,char* argv[]) {
char infile[255],outfile[255];
FILE* in;
FILE* out;
/*declare values*/
int suuzi[100];
int kosuu;
unsigned long long count;
int i,j;
/*open files*/
sprintf(infile,"%s-in%s.txt",argv[1],argv[2]);
sprintf(outfile,"%s-out%s.txt",argv[1],argv[2]);
in=fopen(infile,"r");
if(in==NULL)return 1;
out=fopen(outfile,"w");
if(out==NULL) {
fclose(in);
return 1;
}
/*do work*/
fscanf(in,"%d",&kosuu); /*数字の個数を読み込む*/
for(i=0;i<kosuu;i++) { /*数字の個数繰り返す*/
fscanf(in,"%d",&suuzi[i]); /*数字を読み込む*/
for(j=0;j<=20;j++)kazu[i][j]=-1;/*キャッシュを初期化*/
}
count=kazoe(suuzi,0,0,kosuu); /*式の種類を数える*/
fprintf(out,"%I64u\n",count); /*式の種類を出力*/
free(suuzi);
/*file close*/
fclose(in);
fclose(out);
return 0;
}
unsigned long long kazoe(int *suuzi,int now,int nowsum,int max) {
unsigned long long sum=0,result; /*式の種類*/
int nowsuuzi; /*ここまでの計算結果*/
if(now==max-1) { /*最後だったら*/
if(nowsum==suuzi[now])return 1; /*結果が一致していれば1*/
else return 0; /*違えば0*/
}
if(suuzi[now]!=0) { /*今の数字が0でなければ*/
nowsuuzi=nowsum+suuzi[now]; /*足してみる*/
if(nowsuuzi>=0 && nowsuuzi<=20) {/*条件を満たしていれば*/
if(kazu[now][nowsuuzi]==-1) {/*キャッシュがなければ*/
/*式の種類を数える*/
result=kazoe(suuzi,now+1,nowsuuzi,max);
/*キャッシュを作成する*/
kazu[now][nowsuuzi]=result;
}
sum+=kazu[now][nowsuuzi]; /*式の種類に加える*/
}
nowsuuzi=nowsum-suuzi[now]; /*引いてみる*/
if(nowsuuzi>=0 && nowsuuzi<=20) {/*条件を満たしていれば*/
if(kazu[now][nowsuuzi]==-1) {/*キャッシュがなければ*/
/*式の種類を数える*/
result=kazoe(suuzi,now+1,nowsuuzi,max);
/*キャッシュを作成する*/
kazu[now][nowsuuzi]=result;
}
sum+=kazu[now][nowsuuzi]; /*式の種類に加える*/
}
} else { /*今の数字が0であれば*/
if(kazu[now][nowsum]==-1) { /*キャッシュがなければ*/
/*式の種類を数える*/
/*足しても引いても同じなので2倍*/
result=kazoe(suuzi,now+1,nowsum,max)*2;
kazu[now][nowsum]=result; /*キャッシュを作成する*/
}
sum+=kazu[now][nowsum]; /*式の種類に加える*/
}
return sum; /*ここまでの式の種類を返す*/
}