读完题目之后,内心一片祥和,除了想口吐芬芳........
题意:给定n个数,然后问最后剩余多少个数的时候,还可以把原来的数全部表示出来
举个例子:3 10 19 ,最后剩下2个数3和10即可,因为19=3+3+3+10
题解看一波范围,额,有点小.....最多才
那还想啥,直接暴力
比如3 可以构成3 6 9 12 15......
然后10可以构成10 20 30 40......
然后3和10结合可以构成13 16 19 22 25.....23 26 29 32 35......33.....
然后19,可以由前面比较小的两个数构成,n--
先排下序,然后对于然后判断当前数字是否可以由比他小的前面的数构成,如果当前的数在输入的n个数中,且可以由比其小的数构成n--
#include<bits/stdc++.h>
using namespace std;
int n,a[101],ans;
bool f[25001];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(f,0,sizeof(f));
scanf("%d",&n);
ans=n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+n+1);
f[0]=1;
for(int i=1;i<=n;i++)
{
if(f[a[i]]){ans--;continue;}
for(int j=a[i];j<=a[n];j++)f[j]|=f[j-a[i]];
}
printf("%d\n",ans);
}
}
京公网安备 11010502036488号