1. 程式人生 > 其它 >【題解】UVA10930 A-Sequence

【題解】UVA10930 A-Sequence

題意

判斷一個序列是否滿足兩個條件:

  1. 為遞增序列。

  2. 對於任意序列元素 \(a_i\) 不是之前的任何兩個或多個元素之和。

分析

  1. 為遞增序列: 從前到後掃一遍,看是否有 \(a_i > a_{i+1}\)
  2. 對於任意序列元素 \(a_i\) 不是之前的任何兩個或多個元素之和: 採用 \(dp\) 的思路,將可以用前 \(i\) 個湊出來的數標記,看 \(a_i\) 是否被標記過。(具體實現看程式碼)

Code

#include <bits/stdc++.h>
using namespace std;

const int N = 35, M = 30005;

int a[N];
int f[M];
int t = 1,n;

void print(int flag)
{
	printf("Case #%d:",t ++);
	for (int i = 1; i <= n; i++) printf(" %d",a[i]);
	printf("\nThis is ");
	if (!flag) printf("not ");
	printf("an A-sequence.\n");
	
	return ;
}

int main()
{
	while(cin>>n)
	{
		int sum = 0;
		for(int i=1;i<=n;i++) cin>>a[i],sum += a[i];

		int flag = 1;

		//是否升序
		for(int i=1;i<n;i++) 
		{
			if(a[i] > a[i+1])
			{
				flag = 0;
				break;
			}
		}
		
		memset(f,0,sizeof f);
		f[0] = 1;
		if(flag)
		{
			for(int i=1;i<=n;i++)
			{
				if(f[a[i]])
				{
					flag = 0;
					break;
				}
				for(int j = sum;j >= a[i];j--) if(f[j-a[i]]) f[j] = 1;
			}
		}

		print(flag);
	}

	return 0;
}