本文评论中指出了问题。以后再做纠正
素数伴侣:
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,
从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,
如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,
能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。
样例;
输出: 求得的“最佳方案”组成“素数伴侣”的对数。
样例输入:
4
2 5 6 13
样例输出:
2
利用动态规划解题,dp[i]表示0-i最多有的伴侣数;
当dp[i]+dp[j]为素数。dp[i]+dp[j] = dp[i-1]+dp[j-1]+1;由于伴侣数成对出现,必然只能在i-1和j-1的基础上出现一对。
当dp[i]+dp[j]不为素数。dp[i]=dp[i-1]
故状态转移方程就如上确定了。
#include <iostream>
#include <vector>
using namespace std;
bool isPrime(int n){
if(n <= 1) return false;
for(int i = 2; i * i <= n; i++){
if(n % i == 0) return false;
}
return true;
}
int PrimePairs(vector<int> &vi){
int maxValue = 0;
size_t n = vi.size();
vector<int> dp(n,0);
int cnt = 0;
for(int i=1;i<n;++i)
{
for(int j=i+1;j<n;++j)
{
cnt = isPrime(vi[i-1] + vi[j-1])?(dp[i-1]+dp[j-1]-dp[j]+1):dp[i-1];
dp[i] = max(cnt,dp[i]);
}
}
return dp[n-2];
}
int main(){
int n;
cin >> n;
vector<int> v;
for(int i = 0; i < n; i++){
cin >> v[i];
}
cout << PrimePairs(v);
return 0;
}