选数-做题报告

P1036选数

这是第三次写报告了,这几天一直在刷之前抄题解过的题(再次感谢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;
}

在机房发的嘿嘿,不说了拉屎去了

posted @ 2018-09-17 21:32  加固文明幻景  阅读(2)  评论(0编辑  收藏  举报  来源