wvogel日記

自分用の技術備忘録が多めです.

部分和

C++でコード書く元気はなかったので、前授業で言っていた部分和の問題をCで書いてみた

#include<stdio.h>
#define N 10

int k[5] = {1,2,3,4,5};
int s[5] = {0,0,0,0,0};

int jou(int i){
    if(i == 0)return 1;
    return 2*jou(i-1);
}

int subsetsum(){
    int i,ans = 0;
    int x =0;

    for(i = 0; i < 5;i++){
        if(s[i] == 1){
        ans += k[i];
        x += jou(i);
        }
    }

    x++;
    for(i = 0;i<5;i++){
        s[i] = x%2;
        x /= 2;
        }
    return ans;
}

int main(){
    while(1){
        if(N == subsetsum()){
            printf("Yes\n");
            break;
            }
        if(s[0]==s[1]==s[2]==s[3]==s[4]==1){
            printf("no");
            break;
            }
    }
    return 0;
}


変数名とか考えるの面倒だったから適当。Nの値を変えてやれば他の値についても検証可能。scanfにするのがもっと手っ取り早いかな
さて、このコード、最初書いた時は60行以上あったけど今は確か50行未満。
これ以上短くするにはどうするか。タプルとか使えたら笑