Har bir ikkilik ketma-ketlikni ularni leksikografik jihatdan o’sish tartibida ko’rib borish uchun har bir navbatdagi ketma-ketlikdan keyingi ketma-ketlikni topib borish kerak. Buning uchun oshirish mumkin bo’lgan eng kichik bitni topishimiz kerak, bu 0 ga teng bo’lgan eng kichik razryadli bit. Uning qiymatini 1 qilsak avvalgidan kattaroq son ketma-ketlik hosil bo’ladi, lekin eng kichigi bo’lishi uchun undan keyingi barchasini 0 ga aylantiramiz.
Masalan 100101101111 dan keyingisi 100101110000
int bit[n];
for (int i = 0; i < n; i++) {
bit[i] = 0;
}
while (1) {
while (1) {
long long sum = 0;
for (int i = 0; i < n; i++) {
if (bit[i]==1)
sum += a[i];
}
if (sum==X)
ans++;
int pos = -1;
for (int i = n-1; i >= 0; i--) {
if (bit[i]==0) {
pos = i;
break;
}
}
if (pos==-1)
break;
bit[pos]++;
for (int i = pos+1; i < n; i++) {
bit[i] = 0;
}
}
Uchlik perebor.
Uchlik sanoq sistemasida son 0,1 yoki 2 dan iborat bo’ladi.
Masala: Xaridor X sumlik maxsulot sotib olmoqchi, unda n ta, har biridan ikkitadan bo’lgan qiymati a[1], a[2],…a[n] tangalar bor. U necha xil usulda berilagn X sumni xosil qilishi mumkin?