质数和分解

质数和分解

分析:

本题可以参考集合求数~~
分解成质数之和,所以首先得求素数。由于本题数据不大,打个暴力也行。由于可以分解为多个相同质数的和,所以本题是完全背包。
f[i][j]表示前i个素数和为j的方案数,对于第i个素数,有取和不取两种方案,本题有是求方案数,转移方程就成了:f[i][j]=f[i-1][j]+f[i-1][j-w[i]] (w数组从小到大存求得的素数)。

程序:

二维:

#include <bits/stdc++.h>
using namespace std;
int n,m,w[510];
bool a[510]={};
long long f[510][1010]={};//由于方案数较大,所以会超int
int main()
{
    cin>>n;
    for (int i=2;i<=sqrt(n*1.0);i++)
      if (!a[i])
        for (int j=2;j<=n/i;j++)
          a[i*j]=true;//筛法求素数
    m=0;
    for (int i=2;i<=n;i++)
    {
      if (!a[i]) 
	      w[++m]=i;
    }//素数存到w数组里
    for (int i=1;i<=m;i++)
      f[i][0]=1;
    for (int i=1;i<=m;i++)
      for (int j=1;j<=n;j++)
      {
      	f[i][j]=f[i-1][j];
      	if (j>=w[i])
      	f[i][j]+=f[i][j-w[i]];
      }//dp完全背包求方案数
    cout<<f[m][n];
    return 0;
}

一维:

#include <bits/stdc++.h>
using namespace std;
int n,m,w[510];
bool a[510]={};
long long f[510]={};
int main()
{
    cin>>n;
    for (int i=2;i<=sqrt(n*1.0);i++)
      if (!a[i])
        for (int j=2;j<=n/i;j++)
          a[i*j]=true;
    m=0;
    for (int i=2;i<=n;i++)
    {
      if (!a[i]) 
	      w[++m]=i;
    }
    f[0]=1;
    for (int i=1;i<=m;i++)
      for (int j=w[i];j<=n;j++)
      	f[j]+=f[j-w[i]];
    cout<<f[n];
    return 0;
}

打代码不能手残~~~~~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值