C语言:我编了一个函数“数组”输出“组合”的小程序,但是我想让这个函数输出“组合”中的每一个“组合”与另外一个“数组”比较,看是不是它的子集,不会编了,请教,谢谢!
我编的程序:
#include "stdio.h"
void printCombination(int*arr,const int length,int start,int getcount,int*tempArr,const int tempLength,int*total)
{
if(getcount==0)
{
(*total)++;
for(int index=0;index<tempLength;index++)
{
printf("%d",tempArr[index]);
}
printf("\n");
return;
}
if(getcount>(length-start)||tempLength<getcount||getcount<1)
{
return;
}
for(int i=start;i<length;i++)
{
tempArr[tempLength-getcount]=arr[i];
printCombination(arr,length,i+1,getcount-1,tempArr,tempLength,total);
}
}
int main(int argc,char argv[])
{
int a = 0;
int*total=&a;
int arr[]={1,2,3,4,5,6};
int temp[3];
printCombination(arr,6,0,4,temp,4,total);
printf("total:%d\n",(int)*total);
}
输出结果:
1234
1235
1236
1245
1246
1256
1345
1346
1356
1456
2345
2346
2356
2456
3456
total:15
Press any key to continue
我要实现的是输出的每一个组合,判断是否是另一个数组的子集(另一个数组如:int[]={4,5,6,7,8,9})。
int issubset(int big[], int n, int small[], int m)
{
int i, j;
for (i = 0; i < m; i++) {
int isFound = 0;
for (j = 0; j < n; j++) {
if (small[i] == big[j]) {
isFound = 1;
break;
}
}
if (!isFound) {
return 0;
}
}
return 1;
}
要考虑存在重复元素的话,代码还需要修改下
int issubset(int big[], int n, int small[], int m) {
int i, j;
int isMatched[n] = { 0 };
// 初始化标记数组为0
for (i = 0; i < n; i++) {
isMatched[i] = 0;
}
for (i = 0; i < m; i++) {
int isFound = 0;
for (j = 0; j < n; j++) {
if (small[i] == big[j] && isMatched[j] == 0) {
isFound = 1;
isMatched[j] = 1; /
break;
}
}
if (!isFound) {
return 0;
}
}
return 1;
}
不会编就对了
因为你现在直接print了,根本没有返回子集
你怎么去拿print出来的东西去和另一个数组比呢
你好歹先返回一个二维数组呀
新增了:
int arr2[] = {1, 2, 3};
void printCombination(int*arr,const int length,int start,int getcount,int*tempArr,const int tempLength,int*total)
{
// ... 省略不变代码
for(int index=0;index<tempLength;index++)
{
printf("%d",tempArr[index]);
}
// 新增代码:遍历 arr2 判断是否子集
int isSubset = 1;
for (int i = 0; i < getcount; i++) {
if (!contains(arr2, tempArr[i])) {
isSubset = 0;
break;
}
}
printf("%s\n", isSubset ? "是子集" : "不是子集");
}
// 新增方法判断数组是否包含某值
int contains(int arr[], int val) {
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
if (arr[i] == val) {
return 1;
}
}
return 0;
}
根据你提供的代码片段,无法完全理解你所描述的问题。你所提供的代码片段似乎与最长公共子序列的问题无关。因此,我建议你提供更多的代码片段和问题描述,以便我能够更好地帮助你解决问题。
同时,参考资料中提到了如何计算两个序列的最长公共子序列的长度,你可以根据这个方法来实现你的需求。下面是一个示例的Python代码:
def longest_common_subsequence(x, y):
"""计算两个序列的最长公共子序列的长度"""
m, n = len(x), len(y)
# 创建一个二维数组来保存中间结果
dp = [[0] * (n+1) for _ in range(m+1)]
# 计算dp[i][j],表示x[:i]和y[:j]的最长公共子序列的长度
for i in range(1, m+1):
for j in range(1, n+1):
if x[i-1] == y[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
return dp[m][n]
def is_subset(subset, array):
"""判断subset是否是array的子集"""
for value in subset:
if value not in array:
return False
return True
# 示例用法
x = [1, 2, 3, 4]
y = [1, 3]
lcs_length = longest_common_subsequence(x, y)
is_subset = is_subset(y, x)
print("最长公共子序列的长度:", lcs_length)
print("y是否是x的子集:", is_subset)
这段代码中,longest_common_subsequence
函数使用动态规划的方法计算两个序列的最长公共子序列的长度,而is_subset
函数则判断给定的一个子序列是否是另一个序列的子集。你可以根据这个代码来实现你的需求,根据你所提供的代码片段无法给出更具体的解决方法。希望对你有帮助!如果还有其他问题,请提供更多的信息。