这是第三次写报告了,这几天一直在刷之前抄题解过的题(再次感谢kkk知道),这道题我到最终都没想出来,一直卡在判重这个地方。。。
不说了,给下这几次为了判重写的鸡肋代码
number 1
#include<bits/stdc++.h>
using namespace std;
int a[100000],ans;
int n,m;
bool vis[1000000];
vector<int> s;
inline bool pd(int a)
{
for(int i=2;i<=sqrt(a);i++)
{
if(a%i==0)return 0;
}
return 1;
}
inline int dfs(int sum,int num)
{
if(sum==m&&pd(num))
{
vector<int>::iterator ss=find(s.begin( ), s.end( ),num);
if(ss==s.end())
{
s.push_back(num);
ans++;
}
}
for(int i=1;i<=n;i++)
{
if(!vis[a[i]])
{
vis[a[i]]=1;
dfs(sum+1,num+a[i]);
vis[a[i]]=0;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
dfs(0,0);
cout<<ans;
}
这个就没什么好说的,题目都理解错了,不是答案要判重,而是计算时的加数要判重啊啊啊啊
number 2
#include<bits/stdc++.h>
using namespace std;
int a[100000],ans;
int n,m;
bool vis[1000000];
struct xxx{
int x[100000],y;
}s[100000],node;
int o;
int p=0;
inline bool pd(int a)
{
for(int i=2;i<=sqrt(a);i++)
{
if(a%i==0)return 0;
}
return 1;
}
inline bool pd3(xxx a,xxx b)
{
for(int i=0;i<p;i++)
{
if(a.x[i]!=b.x[i])return 1;
}
return 0;
}
inline bool pd2(xxx a)
{
for(int i=1;i<=o;i++)
{
if(s[i].y==a.y&&!pd3(s[i],a))return 0;
}
return 1;
}
inline int dfs(int sum,int num)
{
if(sum==m&&pd(num))
{
node.y=num;
if(pd2(node))
{
ans++;
o++;
p=0;
s[o]=node;
}
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
vis[i]=1;
s[o].x[p++];
dfs(sum+1,num+a[i]);
s[o].x[p]=0;
vis[i]=0;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
dfs(0,0);
cout<<ans;
}
十分无脑地把每个加数都做了判断。。。写到后面帆哥一直在吵,崩了。。。
我决定了,看题解!
于是我发现。,其实判重的话根本不需要,是因为睿智的我每次递归搜索后循环中的i都是有从零开始算了,这样不重复才怪啊!!!
number 3 (AC) 码
#include<bits/stdc++.h>
using namespace std;
int a[100000],ans;
int n,m;
bool vis[1000000];
vector<int> s;
inline bool pd(int a)
{
for(int i=2;i<=sqrt(a);i++)
{
if(a%i==0)return 0;
}
return 1;
}
inline int dfs(int sum,int num,int ki)
{
if(sum==m&&pd(num))
{
ans++;
}
for(int i=ki;i<=n;i++)
{
if(!vis[i])
{
vis[i]=1;
dfs(sum+1,num+a[i],i+1);
vis[i]=0;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
dfs(0,0,1);
cout<<ans;
}
在机房发的嘿嘿,不说了拉屎去了