给定一个序列,求和为k的最长子序列和最长子序列长度,c语言帮忙提供一个算法
输入一个序列,如: 1,5,6,4,2,3
输入一个整数,如:7
输出:
1 4 2
3
上述例子和为7的子序列有1,4,2 和 3,4 和 2,5 和 1,6
最长子序列为1,4,2,长度为3
如果没有和等于7的序列,则返回null
给定一个序列,求和为k的最长子序列和最长子序列长度,c语言帮忙提供一个算法
输入一个序列,如: 1,5,6,4,2,3
输入一个整数,如:7
输出:
1 4 2
3
上述例子和为7的子序列有1,4,2 和 3,4 和 2,5 和 1,6
最长子序列为1,4,2,长度为3
如果没有和等于7的序列,则返回null
#include <stdio.h>
#include <math.h>
int main()
{
int input[100]{0};
char in;
int n=0;
int tar=0;
int k = 0;
while ((in=getchar())!='\n')
{
if (in!=',')
{
input[n] *=10;
input[n] += (in-48);
}
else
{
n++;
}
}
while ((in = getchar()) != '\n')
{
tar*= 10;
tar+= (in - 48);
}
int len=0;
int v=NULL;
int st = 0;
for (int i = 0; i < (1<<n); i++)
{
int tmp = 0;
int tmp_count = 0;
for (int j = 0; j < n; j++)
{
if ((st>>j)&0x01)
{
tmp += input[j];
tmp_count++;
}
}
if (tmp==tar)
{
if (tmp_count>len)
{
len = tmp_count;
v = st;
}
}
st++;
}
if (v!=NULL)
{
for (int i = 0; i < n; i++)
{
if ((v >> i) & 0x01)
{
printf("%d ", input[i]);
}
}
printf("\n%d", len);
}
else
{
printf("null");
}
}