【題解】UVA10930 A-Sequence
阿新 • • 發佈:2021-08-28
題意
判斷一個序列是否滿足兩個條件:
為遞增序列。
對於任意序列元素 \(a_i\) 不是之前的任何兩個或多個元素之和。
分析
- 為遞增序列: 從前到後掃一遍,看是否有 \(a_i > a_{i+1}\)。
- 對於任意序列元素 \(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; }