链接:
https://codeforces.com/problemset/problem/189/A
题意
Polycarpus有个丝带,他想剪丝带,丝带长度为n,剪丝带需要满足两个条件:
i) :剪完丝带后,每个部分丝带的长度需要满足为a或b或c。
ii):满足第一个条件的前提下,使丝带分成数量最大。
1 ≤ n, a, b, c ≤ 4000
Example
input
5 5 3 2
output
2
input
7 5 5 2
output
2
解析
这题求分成的最大值,第一个条件等价于将a,b,c对应需要的数量设为x,y,z的话,就是需要满足ax + by + cz = n;第二个条件就是求max(x + y + z);然后看数据范围是4e3,如果x,y,z三个依次遍历过去,复杂度是O(n^3),会超时,所以,只要遍历x,y即可,z用减法的方式求出来就行了。
#include <iostream>
using namespace std;
int main()
{
int n, a, b, c;
cin >> n >> a >> b >> c;
int max_sum = 0;
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= n - i; j++)
{
int length_ab = a * i + b * j;
int length_c = n - length_ab;
int num_c = length_c / c;
if (num_c * c == length_c && length_c >= 0)
{
int sum = i + j + num_c;
if (max_sum < sum) max_sum = sum;
}
}
}
cout << max_sum;
return 0;
}