习题10-5 不同素数之和 uva 1213
2017-08-14 11:08
288 查看
点击打开链接
题意:输出N,K,选K个素数,使他们的和为N,问有多少种方案?
令dp
[K]表示选K个素数和为N,则有dp
[K]=dp[N-primes[i]][K-1]。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
vector<int> primes;
int vis[maxn];
int dp[maxn][maxn];
void init()
{
int m=sqrt(maxn+0.5);
for(int i=2;i<=m;i++)
if(!vis[i])
for(int j=i*i;j<=maxn;j+=i)
vis[j]=1;
for(int i=2;i<=maxn;i++)
if(!vis[i]) primes.push_back(i);
}
int main()
{
// freopen("E:\\ACM\\test.txt","r",stdin);
init();
int N,K;
while(cin>>N>>K,N+K)
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=0;i<primes.size();i++)
for(int j=N;j>=primes[i];j--)
for(int k=1;k<=14;k++)
dp[j][k]+=dp[j-primes[i]][k-1];
cout<<dp
[K]<<endl;
}
return 0;
}
题意:输出N,K,选K个素数,使他们的和为N,问有多少种方案?
令dp
[K]表示选K个素数和为N,则有dp
[K]=dp[N-primes[i]][K-1]。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
vector<int> primes;
int vis[maxn];
int dp[maxn][maxn];
void init()
{
int m=sqrt(maxn+0.5);
for(int i=2;i<=m;i++)
if(!vis[i])
for(int j=i*i;j<=maxn;j+=i)
vis[j]=1;
for(int i=2;i<=maxn;i++)
if(!vis[i]) primes.push_back(i);
}
int main()
{
// freopen("E:\\ACM\\test.txt","r",stdin);
init();
int N,K;
while(cin>>N>>K,N+K)
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=0;i<primes.size();i++)
for(int j=N;j>=primes[i];j--)
for(int k=1;k<=14;k++)
dp[j][k]+=dp[j-primes[i]][k-1];
cout<<dp
[K]<<endl;
}
return 0;
}
相关文章推荐
- 习题10-5 UVA - 1213 Sum of Different Primes 不同的素数之和(DP + 素数打表)
- 不同的素数和(uva 1213)
- 习题10-4 UVA 1644 Prime Gap(素数打表+二分查找)
- Sum of Different Primes UVA - 1213 不同素数之和的个数 dp
- 习题10-4 素数间隔 UVa1644
- uva 1213 不同素数之和
- 习题10-5 连续素数之和 uva 1210
- 习题10-6 连续素数之和 UVa1210
- 习题10-5 不同素数之和 UVa1213
- 习题10-6 UVA - 1210 Sum of Consecutive Prime Numbers 连续素数之和(滑动窗口)
- 习题4-10 洪水 UVa815
- 习题8-10 奇怪的股市 UVa1614
- UVA1213 Sum of Different Primes(素数打表+dp)
- 习题10-1 砌砖 UVa11040
- 习题10-9 约数 UVa294
- 习题10-9 UVA 294 Divisors(约数)
- 【习题 7-10 Uva11214】Guarding the Chessboard
- 不同素数间隔(Uva 1644)
- 习题 10-23 UVA - 10479 The Hendrie Sequence
- 习题10-39 UVA 11186 Circum Triangle圆周上的三角形