آقا ممنونم از محبتت....
خیلی زحمت کشیدی با اینکه سرت شلوغه ولی لطف کردی و برام نوشتی.
ولی متاسفانه این سورسی که نوشتی نتیجه درست نمیده...
یعنی داخل مجموعه های خروجی تکرار هست.
من خودمم تا این حد می نویسم ولی هر کاری میکنم تکرار ها رو نمی تونم حذف کنم
ببین چند تاشو مشخص کردم.
Enter n:8
Enter m:4
{1, 1, 1, 1} {1, 1, 1, 2} {1, 1, 1, 3} {1, 1, 1, 4} {1, 1, 1, 5} {1, 1, 1, 6} {1
, 1, 1, 7} {1, 1, 1, 8} {1, 1, 2, 2} {1, 1, 2, 3} {1, 1, 2, 4} {1, 1, 2, 5} {1,
1, 2, 6} {1, 1, 2, 7} {1, 1, 2, 8} {1, 1, 3, 3} {1, 1, 3, 4} {1, 1, 3, 5} {1, 1,
3, 6} {1, 1, 3, 7} {1, 1, 3, 8} {1, 1, 4, 4} {1, 1, 4, 5} {1, 1, 4, 6} {1, 1, 4
, 7} {1, 1, 4, 8} {1, 1, 5, 5} {1, 1, 5, 6} {1, 1, 5, 7} {1, 1, 5, 8} {1, 1, 6,
6} {1, 1, 6, 7} {1, 1, 6, 8} {1, 1, 7, 7} {1, 1, 7, 8} {1, 1, 8, 8} {1, 2, 2, 2}
{1, 2, 2, 3} {1, 2, 2, 4} {1, 2, 2, 5} {1, 2, 2, 6} {1, 2, 2, 7} {1, 2, 2, 8} {
1, 2, 3, 3} {1, 2, 3, 4} {1, 2, 3, 5} {1, 2, 3, 6} {1, 2, 3, 7} {1, 2, 3, 8} {1,
2, 4, 4} {1, 2, 4, 5} {1, 2, 4, 6} {1, 2, 4, 7} {1, 2, 4, 8} {1, 2, 5, 5} {1, 2
, 5, 6} {1, 2, 5, 7} {1, 2, 5, 8} {1, 2, 6, 6} {1, 2, 6, 7} {1, 2, 6, 8} {1, 2,
7, 7} {1, 2, 7, 8} {1, 2, 8, 8} {1, 3, 3, 3} {1, 3, 3, 4} {1, 3, 3, 5} {1, 3, 3,
6} {1, 3, 3, 7} {1, 3, 3, 8} {1, 3, 4, 4} {1, 3, 4, 5} {1, 3, 4, 6} {1, 3, 4, 7
} {1, 3, 4, 8} {1, 3, 5, 5} {1, 3, 5, 6} {1, 3, 5, 7} {1, 3, 5, 8} {1, 3, 6, 6}
{1, 3, 6, 7} {1, 3, 6, 8} {1, 3, 7, 7} {1, 3, 7, 8} {1, 3, 8, 8} {1, 4, 4, 4} {1
, 4, 4, 5} {1, 4, 4, 6} {1, 4, 4, 7} {1, 4, 4, 8} {1, 4, 5, 5} {1, 4, 5, 6} {1,
4, 5, 7} {1, 4, 5, 8} {1, 4, 6, 6} {1, 4, 6, 7} {1, 4, 6, 8} {1, 4, 7, 7} {1, 4,
7, 8} {1, 4, 8, 8} {1, 5, 5, 5} {1, 5, 5, 6} {1, 5, 5, 7} {1, 5, 5, 8} {1, 5, 6
, 6} {1, 5, 6, 7} {1, 5, 6, 8} {1, 5, 7, 7} {1, 5, 7, 8} {1, 5, 8, 8} {1, 6, 6,
6} {1, 6, 6, 7} {1, 6, 6, 8} {1, 6, 7, 7} {1, 6, 7, 8} {1, 6, 8, 8} {1, 7, 7, 7}
{1, 7, 7, 8} {1, 7, 8, 8} {1, 8, 8, 8} {2, 2, 2, 2} {2, 2, 2, 3} {2, 2, 2, 4} {
2, 2, 2, 5} {2, 2, 2, 6} {2, 2, 2, 7} {2, 2, 2, 8} {2, 2, 3, 3} {2, 2, 3, 4} {2,
2, 3, 5} {2, 2, 3, 6} {2, 2, 3, 7} {2, 2, 3, 8} {2, 2, 4, 4} {2, 2, 4, 5} {2, 2
, 4, 6} {2, 2, 4, 7} {2, 2, 4, 8} {2, 2, 5, 5} {2, 2, 5, 6} {2, 2, 5, 7} {2, 2,
5, 8} {2, 2, 6, 6} {2, 2, 6, 7} {2, 2, 6, 8} {2, 2, 7, 7} {2, 2, 7, 8} {2, 2, 8,
8} {2, 3, 3, 3} {2, 3, 3, 4} {2, 3, 3, 5} {2, 3, 3, 6} {2, 3, 3, 7} {2, 3, 3, 8
} {2, 3, 4, 4} {2, 3, 4, 5} {2, 3, 4, 6} {2, 3, 4, 7} {2, 3, 4, 8} {2, 3, 5, 5}
{2, 3, 5, 6} {2, 3, 5, 7} {2, 3, 5, 8} {2, 3, 6, 6} {2, 3, 6, 7} {2, 3, 6, 8} {2
, 3, 7, 7} {2, 3, 7, 8} {2, 3, 8, 8} {2, 4, 4, 4} {2, 4, 4, 5} {2, 4, 4, 6} {2,
4, 4, 7} {2, 4, 4, 8} {2, 4, 5, 5} {2, 4, 5, 6} {2, 4, 5, 7} {2, 4, 5, 8} {2, 4,
6, 6} {2, 4, 6, 7} {2, 4, 6, 8} {2, 4, 7, 7} {2, 4, 7, 8} {2, 4, 8, 8} {2, 5, 5
, 5} {2, 5, 5, 6} {2, 5, 5, 7} {2, 5, 5, 8} {2, 5, 6, 6} {2, 5, 6, 7} {2, 5, 6,
8} {2, 5, 7, 7} {2, 5, 7, 8} {2, 5, 8, 8} {2, 6, 6, 6} {2, 6, 6, 7} {2, 6, 6, 8}
{2, 6, 7, 7} {2, 6, 7, 8} {2, 6, 8, 8} {2, 7, 7, 7} {2, 7, 7, 8} {2, 7, 8, 8} {
2, 8, 8, 8} {3, 3, 3, 3} {3, 3, 3, 4} {3, 3, 3, 5} {3, 3, 3, 6} {3, 3, 3, 7} {3,
3, 3, 8} {3, 3, 4, 4} {3, 3, 4, 5} {3, 3, 4, 6} {3, 3, 4, 7} {3, 3, 4, 8} {3, 3
, 5, 5} {3, 3, 5, 6} {3, 3, 5, 7} {3, 3, 5, 8} {3, 3, 6, 6} {3, 3, 6, 7} {3, 3,
6, 8} {3, 3, 7, 7} {3, 3, 7, 8} {3, 3, 8, 8} {3, 4, 4, 4} {3, 4, 4, 5} {3, 4, 4,
6} {3, 4, 4, 7} {3, 4, 4, 8} {3, 4, 5, 5} {3, 4, 5, 6} {3, 4, 5, 7} {3, 4, 5, 8
} {3, 4, 6, 6} {3, 4, 6, 7} {3, 4, 6, 8} {3, 4, 7, 7} {3, 4, 7, 8} {3, 4, 8, 8}
{3, 5, 5, 5} {3, 5, 5, 6} {3, 5, 5, 7} {3, 5, 5, 8} {3, 5, 6, 6} {3, 5, 6, 7} {3
, 5, 6, 8} {3, 5, 7, 7} {3, 5, 7, 8} {3, 5, 8, 8} {3, 6, 6, 6} {3, 6, 6, 7} {3,
6, 6, 8} {3, 6, 7, 7} {3, 6, 7, 8} {3, 6, 8, 8} {3, 7, 7, 7} {3, 7, 7, 8} {3, 7,
8, 8} {3, 8, 8, 8} {4, 4, 4, 4} {4, 4, 4, 5} {4, 4, 4, 6} {4, 4, 4, 7} {4, 4, 4
, 8} {4, 4, 5, 5} {4, 4, 5, 6} {4, 4, 5, 7} {4, 4, 5, 8} {4, 4, 6, 6} {4, 4, 6,
7} {4, 4, 6, 8} {4, 4, 7, 7} {4, 4, 7, 8} {4, 4, 8, 8} {4, 5, 5, 5} {4, 5, 5, 6}
{4, 5, 5, 7} {4, 5, 5, 8} {4, 5, 6, 6} {4, 5, 6, 7} {4, 5, 6, 8} {4, 5, 7, 7} {
4, 5, 7, 8} {4, 5, 8, 8} {4, 6, 6, 6} {4, 6, 6, 7} {4, 6, 6, 8} {4, 6, 7, 7} {4,
6, 7, 8} {4, 6, 8, 8} {4, 7, 7, 7} {4, 7, 7, 8} {4, 7, 8, 8} {4, 8, 8, 8} {5, 5
, 5, 5} {5, 5, 5, 6} {5, 5, 5, 7} {5, 5, 5, 8} {5, 5, 6, 6} {5, 5, 6, 7} {5, 5,
6, 8} {5, 5, 7, 7} {5, 5, 7, 8} {5, 5, 8, 8} {5, 6, 6, 6} {5, 6, 6, 7} {5, 6, 6,
8} {5, 6, 7, 7} {5, 6, 7, 8} {5, 6, 8, 8} {5, 7, 7, 7} {5, 7, 7, 8} {5, 7, 8, 8
} {5, 8, 8, 8} {6, 6, 6, 6} {6, 6, 6, 7} {6, 6, 6, 8} {6, 6, 7, 7} {6, 6, 7, 8}
{6, 6, 8, 8} {6, 7, 7, 7} {6, 7, 7, 8} {6, 7, 8, 8} {6, 8, 8, 8} {7, 7, 7, 7} {7
, 7, 7, 8} {7, 7, 8, 8} {7, 8, 8, 8} {8, 8, 8, 8}
golden_compass
14-05-2008, 13:11
الگوریتمی که خودم کشفش کردم وخیلی باهاش حال می کنم :
هر مجموعه رو مثل {3و2و1} به صورت دنباله ای از 0 و 1 ها یا بهتر بگم یه عدد باینری در نظر می گیریم. در مرحله اول دنباله برای مجموعه بالا 000 هست. با توجه به وجود هر عدد یک، عضو متناظر با آن در مجموعه را چاپ می کنیم. برای مر حله بعد یک عدد به عدد باینریمون اضافه می کنیم. واضح است که تمام زیر مجموعه ها چاپ خواهند شد. (عدد باینری از 0 تا( 2 به توان n )منهای 1 تغییر می کند...) حالا می تونید یه متد تعریف کنید که تعداد 1 ها رو بشمره تا مجموعه های k عضوی مورد نظرتون رو چاپ کنید.
این الگوریتم سرعت فوق العاده بالایی داره اما عیبی که داره اینه که نمیشه تحت این الگوریتم تمام زیر مجموعه ها رو به ترتیب تعداد اعضا چاپ کرد اما فکر می کنم سرعت فوق العاده بالاش این عیبش رو می پوشونه.
البته من پست های بقیه دوستان رو نخوندم، شاید تو اون ها به این الگوریتم اشاره شده باشه... فقط خواستم کمک کرده باشم.
اینم سورسش که امروز با جاوا نوشتم و به راحتی می تونید به ++c برش گردونید:
import java.util.Scanner;
import java.lang.Math ;
public class Main {
public static int counter = 0 ;
public static int Number_of_Ones (String a){
int result = 0 ;
for (int i = 0 ; i < a.length() ; i++){
if (a.charAt(i) == '1'){
result++ ;
}
}
return result ;
}
public static int lastOne (String a){
int result = -1 ;
for (int i = a.length() - 1 ; i >=0 && result < 0; i--){
if (a.charAt(i) == '1')
result = i ;
}
return result ;
}
public static String Convert_to_Binary (int Number , int n){
String Result = "";
for (int i = 1 ; i <= n ; i++){
Result = (Number%2) + Result ;
Number /= 2 ;
}
return Result ;
}
public static String sum1 (String a , int n){
String result = "" ;
counter++ ;
result = Convert_to_Binary(counter , n) ;
return result ;
}
public static void main(String[] args) {
Scanner input = new Scanner (System.in) ;
int n = input.nextInt();
int s = input.nextInt();
int m = (int) Math.pow(2, n) ;
int[]array = new int [n] ;
String binaries = "" ;
for (int i = 0 ; i < n ; i++){
array[i] = i + 1 ;
binaries += 0 ;
}
for (int i = 0 ; i < m ; i++){
if (Number_of_Ones(binaries) == s){
System.out.print("{") ;
for (int j = 0 ; j < n ; j++){
if (binaries.charAt(j) == '1')
if (j == lastOne(binaries))
System.out.print(array[j]) ;
else
System.out.print(array[j] + ",") ;
}
System.out.println("}") ;
}
binaries = sum1(binaries , n) ;
}
}
}
اینم خروجیش برای n = 8 , k = 4:
8
4
{5,6,7,8} - {4,6,7,8} - {4,5,7,8} - {4,5,6,8} - {4,5,6,7} - {3,6,7,8} - {3,5,7,8} - {3,5,6,8} - {3,5,6,7} - {3,4,7,8} - {3,4,6,8} - {3,4,6,7} - {3,4,5,8} - {3,4,5,7} - {3,4,5,6} - {2,6,7,8} - {2,5,7,8} - {2,5,6,8} - {2,5,6,7} - {2,4,7,8} - {2,4,6,8} - {2,4,6,7} - {2,4,5,8} - {2,4,5,7} - {2,4,5,6} - {2,3,7,8} - {2,3,6,8} - {2,3,6,7} - {2,3,5,8} - {2,3,5,7} - {2,3,5,6} - {2,3,4,8} - {2,3,4,7} - {2,3,4,6} - {2,3,4,5} - {1,6,7,8} - {1,5,7,8} - {1,5,6,8} - {1,5,6,7} - {1,4,7,8} - {1,4,6,8} - {1,4,6,7} - {1,4,5,8} - {1,4,5,7} - {1,4,5,6} - {1,3,7,8} - {1,3,6,8} - {1,3,6,7} - {1,3,5,8} - {1,3,5,7} - {1,3,5,6} - {1,3,4,8} - {1,3,4,7} - {1,3,4,6} - {1,3,4,5} - {1,2,7,8} - {1,2,6,8} - {1,2,6,7} - {1,2,5,8} - {1,2,5,7} - {1,2,5,6} - {1,2,4,8} - {1,2,4,7} - {1,2,4,6} - {1,2,4,5} - {1,2,3,8} - {1,2,3,7} - {1,2,3,6} - {1,2,3,5} - {1,2,3,4} -
ایرادی که تو سورس بالا هست (و قابل رفع شدن هم هست) اینه که من تو حلقه for آخر، i رو از 0 تا m که برابر 2 به توان n هست تغییر دادم که این ممکن است overflow رو (در ++c) در پی داشته باشه. برای رفع اون می تونید دنباله خودتون رو با دنباله n تایی 1...111 مقایسه کنید و بگید تا زمانی که از این عدد ((2 به توان n )منهای 1) کوچکتر یا مساوی هست به عدد اضافه کن و در ادامه باید اون counter رو هم حذف کنید و به جاش جمع دودویی رو روی آرایه n تایی پیاده کنید. اگر بخواهید خیلی بهینه باشید، آرایه رو هم می تونید boolean تعریف کنید و ... .
من از String استفاده کردم، چون سریع تر می تونستم کد رو بنویسم. اما استفاده از آرایه پردازش رو خیلی کمتر می کنه...
همون طوری که می بنید بر خلاف ظاهر پیچیدش، راه حل بسیار ساده ای داشت!
اگر ترتیب خاصی مد نظرتون نیست، از این الگوریتم استفاده کنید...
موفق باشید.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.