2018/7/28

P1036 选书

ps:dfs

//递归写全排列,直接判断素数
//递归是形式,用递归实现dfs ,暴搜
//递归边界条件用来剪枝 
#include<iostream>
using namespace std;
#include<cmath>

bool is_prime(int x){
    for(int i=2;i<=sqrt(x);i++){
        if(x%i==0) return false;
    }
    return true ;
}
int n,k;
int ans;
int a[21];
void dfs(int step,int sum,int cnt){
    if(step == n+1 || cnt == k ){
        if(is_prime(sum)) {
            if(cnt == k) ans++;
        }
        return ;
    }
    dfs(step+1,sum+a[step],cnt+1);
    dfs(step+1,sum,cnt);
    return ;

}
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    ans=0;
    dfs(1,0,0);
    cout<<ans<<endl;
    
} 
View Code

P1028 数的计算

ps:递推

//递归写错了 
//#include<bit/stdc++.h>
//

/*#include<iostream>
using namespace std;
int m[110];
int digui(int x){
    if(m[x] != 0){
        return m[x];
    }
    if(x==1 ){
        return 0;
    }
    else if(x ==2) {
        return 3;
    }
    else if(x == 3){
        return 5;
    }
    return m[x]=digui(x/2)+1;
}
int n;
int main(){
    //memset(m,0,sizeof(m));
    
    cin>>n;
    for(int i=0;i<=n;i++){
        m[i]=0;
    }
    cout<<digui(n)<<endl;
    //system("pause");
    return 0;
}
*/ 
//不能只存后缀吗?错了 
/*#include<iostream>
using namespace std;
int n;
int f[1100];
int main(){
    cin>>n;
    f[1]=1;
    f[2]=3;
    f[3]=5;
    f[4]=4;
    for(int i=5;i<=n;i++){
        f[i]=f[i/2]+1;
    }
    cout<<f[n]<<endl;
    system("pause");
    return 0;
}*/
//re是数组开的太小了,数组越界
#include<iostream>
using namespace std;
int n;
int f[1100];
int main(){
    cin>>n;
    f[1]=1;
    f[2]=2;
    f[3]=2;
    f[4]=4;

    for(int i=5;i<=n;i++){
        for(int j=1;j<=i/2;j++){
            f[i]+=f[j];
        }
        f[i]+=1;
    }
    cout<<f[n]<<endl;
    //system("pause");
    return 0;
}
View Code

 

posted @ 2018-07-30 22:02  SUMay  阅读(133)  评论(0编辑  收藏  举报