解题思路:

谜一样的题。。谁能告诉我样例里面为什么是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.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

吴世杰 4年前 回复TA
这样做会超时嘛
小小 5年前 回复TA
因为每次能取的数量p是现有数量m的质因数,15取3*2后剩下9,9只能再取3而不能取2