原题链接:蓝桥杯算法提高VIP-拿糖果
解题思路:
谜一样的题。。谁能告诉我样例里面为什么是6不是7,命名15-3*2-2*2-2*2 = 1,剩下的不是更小吗,也可以啊。。。
注意事项:
参考代码:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <stdio.h>
#include <limits.h>
#include <math.h>
#define N 2000
#define MAX_N 100000
using namespace std;
bool nPrime[N];
vector<int> primeList;
int dp[MAX_N];
void getPrime(int n)
{
for (int i = 2; i <= n; i++)
{
if (nPrime[i] == false)
primeList.push_back(i);
for (int j = 0; j < primeList.size() && i*primeList[j] <= n; j++)
{
nPrime[i*primeList[j]] = true;
if (i % primeList[j] == 0)
break;
}
}
}
int solve_dfs(int res)
{
if (res < 4)
return res;
else
{
int ans = INT_MAX;
for (int i = 0; i < primeList.size() && primeList[i]*primeList[i] <= res; i++)
{
if (res - 2 * primeList[i] >= 0)
{
int temp = solve_dfs(res - 2 * primeList[i]);
if (temp < ans)
ans = temp;
}
}
return ans;
}
}
int solve_dp(int n)
{
dp[1] = 1;dp[2] = 2;dp[3] = 3;
for (int i = 4; i <= n; i++)
{
int ans = INT_MAX;
for (int j = 0; primeList[j]*primeList[j] <= i; j++)
{
if (i - 2 * primeList[j] >= 0)
ans = min(dp[i - 2 * primeList[j]], ans);
}
dp[i] = ans;
}
return (n - dp[n]) / 2;
}
int main()
{
int n = 0;
cin >> n;
getPrime(317);
//cout << (n - solve_dfs(n))/2 << endl;
int ans = solve_dp(n);
if (n % 2)
cout << ans - 1 << endl;
else
cout << ans << endl;
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复