代码我就不发了(太丑兰),我说一下我的思路:
一、我发现所要的m只是要使b[1->m]可以组成a[1->n]中的任何一个数
二、接着我又觉得a[i]越小,越会在b[i]中,所以对a小到大排序
三、然后,初始化,b[1] = a[1], num = 1;//num是m
四、就是 for i = 2 to n:对于a[i]看看他是否能被b[]组成,于是我就写了个这个:
inb check (int x)
{
int comg = dp[1], sum = 0;
for (rint i = 1; i <= dp[0]; i++)
{
sum += dp[i];
comg = gcd (comg, dp[i]);
if (x % dp[i] == 0 || (x % comg == 0 && x >= sum))//看看是否可以组成
return false;
}
return true;
}
int main ()
{
//freopen (".in", "r", stdin); freopen (".out", "w", stdout);
t = read ();
while (t --)
{
n = read ();
for (rint i = 1; i <= n; i++)
a[i] = read ();
sort (a + 1, a + n + 1);
memset (dp, 0, sizeof (dp));
dp[0] = 1, dp[1] = a[1];
for (rint i = 2; i <= n; i++)
{
if (!check (a[i])) continue;//这里
dp[++dp[0]] = a[i];//无法组成就把它加进去吧
}
printf ("%d\n", dp[0]);
}
就是我用裴蜀定理判的是否可以组成,忘了张数不可为负,求出来的值整数解,而不是
比如:11x + 13y = 17 有解, 但是x = -1, y = 2。。。