Thinking: First we get the sum. The meaning of array number[i][j] means: if we use numbers before sequence[i], what number can we get. If we can get the number , then number[i][j] = true.
In the code we simplified them to one dimension array.
number[0] = 1 is needed.
Code:
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#include<stack>
#include<algorithm>
#include<vector>
#define lli long long int
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
using namespace std;
bool number[30005];
int main()
{
int sequence[35];
int D;
int T = 0;
while (scanf("%d", &D) != EOF)
{
int sum = 0;
bool A = true;
T++;
for (int i = 1; i <= D; i++)
{
scanf("%d", &sequence[i]);
sum += sequence[i];
}
for (int i = 1; i < D; i++)
if (sequence[i] >= sequence[i+1])
A = false;
if (A)
{
memset(number, false, sizeof(number));// number means whether we can get sum using numbers before sequence[i]
number[0] = 1;
for (int i = 1; i <= D; i++)
{
if (number[sequence[i]])
{
A = false;
break;
}
for (int j = sum; j >= sequence[i]; j--)
{
if (number[j - sequence[i]])
number[j] = true;
}
}
}
if (A)
{
printf("Case #%d:", T);
for (int i = 1; i <= D; i++)
printf(" %d", sequence[i]);
printf("\nThis is an A-sequence.\n");
}
else {
printf("Case #%d:", T);
for (int i = 1; i <= D; i++)
printf(" %d", sequence[i]);
printf("\nThis is not an A-sequence.\n");
}
}
return 0;
}