#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 20;
int n;
int s[60][3];
int main()
{
//p, q互质,p和q不能凑出的最小数字是 (p-1)(q-1)-1
//eg. (4, 3) 所有大于5的数都能被凑出来
//7+4+3=14,k套,剩余n-14k,剩余的钱不会很大,剩余很多就可以再买一套
//剩余的钱n-14k<20,如果>=20,那么就是 >= 14 + 6
//14是一套的钱,6以上的钱数,是可以用4,3凑出来的
//所以n-14k要严格小于20
memset(s, -1, sizeof s);
for (int i = 0; i < 20; i++)
{
for (int a = 0; a * 7 <= i; a++)
for (int b = 0; a * 7 + b * 4 <= i; b++)
if ((i - a * 7 - b * 4) % 3 == 0)
{
int c = (i - a * 7 - b * 4) / 3;
if (s[i][0] == -1 || a + b + c > s[i][0] + s[i][1] + s[i][2])
s[i][0] = a, s[i][1] = b, s[i][2] = c;
}
}
scanf("%d", &n);
if (n == 1 || n == 2 || n == 5) printf("-1\n");
else
{
for (int k = n / 14; k >= 0; k--) //k最多枚举两个数,k=n/14, k=n/14-1(剩余1、2、5的时候,再拿出14凑给r)
{
int r = n - 14 * k;
if (s[r][0] != -1)
{
printf("%d %d %d\n", k + s[r][0], k + s[r][1], k + s[r][2]);
break;
}
}
}
return 0;
}
感谢yxc
if (s[i][0] == -1 || a + b + c > s[i][0] + s[i][1] + s[i][2]) 里这个s[i][0] == -1条件没用吧!
为什么要
s[60][3]
,60是怎么来的?是s[20][3],60是我自己打表的时候开的,忘记修改回来了。