题目来源于:洛谷
题目本质:dp,数学,贪心,背包
错误原因:没有将记录答案的ans初始化为0
解题思路:
使用a[i]来表示不同情况,a[i]=0表示没有i这个数,a[i]=1表示可以凑出i这个数,a[i]=2表示本身就有i这个数。如果处理完成之后a[1~n]中还有等于2的(即本身就有这个数并且不能凑(只能他凑别人))就让ans++,最后输出就好了。!记得初始化ans=0.
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=25005;
const int M=1005;
int a[M];
int b[N];
int t,n;
int ans=0;
int main(){
cin>>t;
while(t--){
ans=0;
memset(b,0,sizeof(b));
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>a[i];
b[a[i]]=2;
}
sort(a+1,a+1+n);
for(int i=1;i<=a[n];i++){
if(b[i]>0){
for(int j=1;j<=n;j++){
if(i+a[j]<=a[n])
b[i+a[j]]=1;
else{
break;
}
}
}
}
for(int i=1;i<=a[n];i++){
if(b[i]==2){
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}