华为0904笔试第一题之买钉子

859 阅读1分钟

1.题目

输入需要买的钉子数n,买钉子时只能按盒买,一盒4枚或一盒9枚,如果恰好能买到n枚钉子,输出最少盒数,如果不能买到,输出-1。

示例:

输入:13

输出:2

2.思路

这是一道dp的题,定义一个一维dp矩阵,大小为n+1,初始化为-1,dp[i]表示的是买i枚钉子最少需要买几盒。如果dp[i]能买到,那么dp[i-4]或dp[i-9]一定也能买到。

3.代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	int n;
	cin >> n;
	vector <int> dp(n + 1, -1);
	//处理n<=9的特殊情况
	if (n <= 9)
	{
		if (n == 4)
			cout << 1 << endl;
		if (n == 8)
			cout << 2 << endl;
		if (n == 9)
			cout << 1 << endl;
		return 0;
	}
	//初始化dp矩阵
	dp[4] = 1;
	dp[8] = 2;
	dp[9] = 1;
	//填充矩阵
	for (int i = 10; i < n + 1; i++)
	{
		if ((dp[i - 4] == -1) && (dp[i - 9] == -1))
			dp[i] = -1;
		if ((dp[i - 4] == -1) && (dp[i - 9] != -1))
			dp[i] = dp[i - 9] + 1;
		if ((dp[i - 4] != -1) && (dp[i - 9] == -1))
			dp[i] = dp[i - 4] + 1;
		if ((dp[i - 4] != -1) && (dp[i - 9] != -1))
			dp[i] = min(dp[i-1],dp[i-9]) + 1;
	}
	if (dp[n] == -1)
		cout << -1 << endl;
	else
		cout << dp[n] << endl;
	return 0;
}