서브 집합 문제 알고리즘 분석 과 실현 (재 귀, 비 재 귀)
숫자 집합 {1, 2, 3} 이 있 으 면 그 부분 집합 은 NULL, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3} 이다.현재 주어진 배열 은 모든 부분 집합 을 구 합 니 다.
다음 과 같이 구현:
//
//{1,2,3}
// 0 0 0
// 0 0 1
// 0 1 0
// 0 1 1
// 1 0 0
// 1 0 1
// 1 1 0
// 1 1 1
// , 2
//
//
class Solution
{
public:
void subset(int *value, int size)
{
if (value == NULL || size < 1) return;//
int *tmp = (int *)malloc(size * sizeof(int));//
assert(tmp != NULL);
memset(tmp, 0, size*sizeof(int));
int num = (int)pow((double)2, (double)size);//
cout << "NULL" << endl;
for (int i = 1; i < num; ++i)
{
for (int j = 0; j < size; ++j)// ,
{
if (tmp[j] == 1) tmp[j] = 0;//
else if (tmp[j] == 0)
{
tmp[j] = 1;
break;
}
}
for (int j = 0; j < size; ++j)// ,
{
if (tmp[j] == 1) cout << value[j] << " ";
}
cout << endl;
}
delete tmp;//
}
};
//
class Solution
{
public:
int *tmp;//
void createArray(int size)//
{
tmp = (int *)malloc(size * sizeof(int));
assert(tmp != NULL);
memset(tmp, 0, size * sizeof(int));
}
void deleteArray()//
{
free(tmp);
}
void subsetRecursive(int *value, int m, int size)
{
if (m == -1)// ,
{
for (int i = size - 1; i >= 0; --i)
{
if (tmp[i] == 1) cout << value[i] << " ";// 1
}
cout << endl;
}
else
{
tmp[m] = 0;// 0,
subsetRecursive(value, m - 1, size);//
tmp[m] = 1;// 1,
subsetRecursive(value, m - 1, size);//
}
}
void subset(int *value, int size)
{
if (value == NULL || size < 1) return;//
createArray(size);
subsetRecursive(value, size - 1, size);//
deleteArray();
}
};
결 과 는 그림 과 같다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
물체 검출의 평가 지표 IoU의 계산 방법Yolo나 SSD 등 물체 검출에서 평가 지표로 사용되는 IoU에 대해 조사했으므로 정리했습니다. IoU (Intersection over Union)는 두 영역이 얼마나 겹치는지를 나타내는 지표입니다. 두 영역의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.