【题意】给n个数,求一个数,使这个数能且只能由(n个数每个至少出现一次)表示。输出满足条件的最小的数。
【分析】(完全背包)如果有满足条件的最小的数,那么这个数只能是这n个数的和total,通过记录每个可能和的组合数,求出total的组合数,如果为1则表示满足条件,即n个数每个正好出现一次,若>1,则找不到这样的数,即输出-1。
【代码】
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,total; int b[35]; int v[350000]; int cash() { total=0; scanf("%d",&n); memset(v,0,sizeof(v)); v[0]=1; for(int i=0;i<n;i++) { scanf("%d",&b[i]); total+=b[i]; } for(int i=0;i<n;i++) { for(int j=b[i];j<=total;j++) v[j]+=v[j-b[i]]; } if(v[total]==1) return total; else return -1; } int main (void) { int c; scanf("%d",&c); while(c--) { getchar(); printf("%d ",cash()); } return 0; }