zadanie rekurencja podzbiory

0
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
const int N=9;
int tb[N]={};
                    void print(int t[])
                        {
                            for(int i=0;i<N;i++)
                                cout<<t[i]<<" ";
                            cout<<"\n";
                        }
                    void create(int t[])
                        {
                            srand(time(NULL));
                            for(int i=0;i<N;i++)
                                t[i]=0+rand()%20;
                        }
                    int dwa(int t[],int t2[])
                        {
                            int l=0,a,s=0;

                            for(int i=0;i<N;i++)
                                {
                                    a=t[i];
                                    l=0;
                                    while(a>0)
                                    {
                                        if(a%2==1)
                                        {
                                            l++;
                                            a=a/2;
                                        }else a=a/2;
                                    }
                                    t2[i]=l;
                                }
                            for(int i=0;i<N;i++)
                                s=s+t2[i];
                            return s;
                        }
                    void zeruj(int t[])
                        {
                            for (int i=0;i<N;i++)
                                t[i]=0;
                        }
                    int  podzbior (int t[], int t2[],int n,int i)
                        {
                        if(i>N)return 0 ;
                        else{
                           if(n==0)
                           {
                               cout<<"[";
                               for(int j=0;j<N;j++)
                                if(tb[j]!=0)
                                    cout<<tb[j]<<" ";
                                cout<<"]\n";
                                zeruj(t);
                                return 0;
                           }else
                            {
                                    {tb[i]=t[i];
                                    return podzbior(t,t2,n-t2[i],i+1) || podzbior(t,t2,n,i+1);
                                    tb[i]=0;}
                            }
                        }
                                   // return ;
                        }

int main()
{
    int t[N];
    int t2[N];

    create(t);
    print(t);
    cout<<dwa(t,t2)<<"\n";
    if(dwa(t,t2)%3==0)
        podzbior(t,t2,dwa(t,t2)/3,0);
    else cout<<"PODZIAL NIE ISTNIEJE\n";
    cout<<"\n";
    print(t2);
    cout<<"\n";
    system("PAUSE");
}

Dany jest zbiór n liczb naturalnych umieszczony w tablicy typu tab=array[1..n] of integer.
Proszę napisać funkcję, która zwraca informację, czy jest możliwy podział zbioru n liczb na trzy
podzbiory, tak aby w każdym podzbiorze, łączna liczba jedynek użyta do zapisu elementów tego
podzbioru w systemie dwójkowym była jednakowa. Na przykład:
{2,3,5,7,15} -> true, bo podzbiory {2,7} {3,5} {15} wymagają użycia 4 jedynek,
{5,7,15} -> false, podział nie istnieje.
może ktoś napisać dlaczego program nie wypisuje wszystkich możliwości ??

dodanie znacznika <code class="cpp"> - fp

0

W tytule masz napisane rekurencja - wnioskuję więc, że funkcja również miała być rekurencyjna.

Ten kod jest tak chaotyczny, że nawet nie mam siły go czytać.
Prawdopodobnie nie działa, bo nie sprawdzasz elementów NIE następujących po sobie.

Ilość jedynek w zapisie bitowym oblicza się w ten sposób:

int a = 0; while( liczba ) { a += (liczba&1); liczba >>= 1;}

Spróbuj pomyśleć o tym tak.
{1} {2} {reszta}
{1} {3} {reszta}
...
{1}, {N} {reszta}
{1, 2}, {3}, {reszta}
...
{1, 2}, {N}, {reszta}
{1, 3}, {2}, {reszta}

0

Wyliczenie ilości jedynek:

unsigned licznik=0;
for(;liczba;liczba&=(liczba-1)) ++licznik;

1 użytkowników online, w tym zalogowanych: 0, gości: 1