189A. Cut Ribbon

链接:

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值