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);
if (n <= 9)
{
if (n == 4)
cout << 1 << endl;
if (n == 8)
cout << 2 << endl;
if (n == 9)
cout << 1 << endl;
return 0;
}
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;
}