P1684DP求调,WA了快十遍了,代码有注释
  • 板块学术版
  • 楼主Flying_hp
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/12 19:44
  • 上次更新2024/10/12 21:31:53
查看原帖
P1684DP求调,WA了快十遍了,代码有注释
1123665
Flying_hp楼主2024/10/12 19:44
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll t,n,a[35];
ll dp[300010];//d组成i的方法 
bool have[300010];//i是否在原数组中有 
ll cnt[300010]; 
ll ans;
ll maxn;
signed main() {
	cin>>t;
	while(t--) {
		cin>>n;
		ans=0;
		memset(dp,0,sizeof dp);
		memset(have,false,sizeof have);//初始化 
		memset(cnt,0,sizeof cnt); 
		for(ll i=1; i<=n; i++)
			cin>>a[i],have[a[i]]=true,cnt[a[i]]++;//赋值 
		sort(a+1,a+n+1);//排序,因为没有负数,所以i不可能被比他小的数组成,就不会发生重复了 
		for(ll i=1;i<=n;i++){
			ans+=dp[a[i]];//答案++ 
			for(ll j=1;j<a[i];j++){//枚举所有比a[i]小的数,原因在17行 
				dp[a[i]+j]+=dp[j];//正常累加 
				if(have[j])dp[a[i]+j]++;//如果两个数都是原数组中的数,就再++,因为dp[i]中并没有0+i 
			}	
			if(dp[a[i]]||cnt[a[i]]>1)
			dp[a[i]+a[i]]+=dp[a[i]];//如果a[i]可以被组成,或者有多个a[i]时,累加,因为上面只枚举了比a[i]小的数 
		}
		cout<<ans<<endl;
	}
	return 0;
}

2024/10/12 19:44
加载中...