1つのセットのすべての非空のサブセットをリストします.

1366 ワード

全体的な考え方.
description:
まず例を見てみましょう
A={a, b ,c ,d}
非空のサブセットあり
{a}
     |-->{a, b ,c }-->{a, b ,c ,d}
{a, b}-->|
     |-->{a, b ,d}  
{a, c}-->{a, c ,d}
{a, d}
{b}
    
{b, c}-->{b ,c ,d}
{b, d}  
{c}
{c, d}
{d}
上記の例では法則を発見しましたか?
サブセット{a},{b},{c},{d}は、それぞれ、サブセット要素{a,b,c,d}に追加されていない空のセットと組み合わせられる.
サブセット{a,b},{a,c},{a,d}は、サブセット{a}とサブセット要素{b,c,d}に追加されていないいずれかとを組み合わせたものである.
サブセット{a,b,c}および{a,b,c}は、それぞれサブセット{a,b}と、サブセット要素{c,d}に追加されていないいずれかと組み合わせられる.
サブセット{a,b,c,d}は、サブセット{a,b,c}と、サブセット要素{d}に追加されていないいずれかとを組み合わせたものである.
次はコードです
#include 
#include 


int count = 0;	//       

void print(char *str)
{	
	printf("%d: %s
", ++count, str); } //start //end // void sub_list(char *start, char *end, char *str) { char *p = start; int len = strlen(str); while( p <= end ) // , { str[len] = *p; // 。 str[len+1] = 0; print(str); p++; sub_list(p, end, str);// 。 str[len] = 0; } } int main() { char sub[] = "abcdef"; char str[255]; memset(str, 0, 255*sizeof(char)); printf(" collent {%s} :
", sub); sub_list(sub, &sub[strlen(sub)-1], str ); }