Polycarpus 有一条丝带,其长度为 n。他希望以满足以下两个条件的方式进行剪彩: 切割后,每条丝带的长度应为 a、b 或 c。 切割后丝带片数应达到最大。 帮助波利卡普斯找到所需切割后的丝带片数。 第一行包含四个空格分隔的整数n、a、b和c(1 ≤ n, a, b, c ≤ 4000)——相应地,原始丝带的长度和切割后丝带片的可接受长度。数字a、b和c可以重合。 打印一个数字——最大可能的色带片数。保证至少存在一次正确的剪彩。
有点简单的代码,但无法处理 45 测试。无法提出反驳此代码的测试。不是TL,错误答案
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
int n, a, b, c;
cin >> n;
cin >> a >> b >> c;
if (a < b) swap(a, b);
if (a < c) swap(a, c);
if (b < c) swap(b, c);
for (int i = 0; i <= n / a; i++)
{
for (int j = 0; j <= n / b; j++)
{
for (int k = 0; k <= n / c; k++)
{
if (n - (i * a + j * b + k * c) == 0)
{
int answer=i+j+k;
cout << answer;
return 0;
}
}
}
}
cout << 0;
return 0;
}
你的解决方案是错误的,我给你举个例子:
n = 101, a = 50, b = 49, c = 3
因为你的解决方案会因
i = 0, j = 2, k = 1
而中断。
但最好的解决方案是
i = 1, j = 0, k = 17
。