阿短的口袋里有 n 元钱,他想用这些钱买三种不同的零食:
- 薯片,每包 33 元。
- 巧克力棒,每个 88 元。
- 饼干,每盒 1111 元。
设薯片、巧克力棒和饼干的订购数量分别为a、b和c。小可的订购原则如下:
- 必须将所有的钱都用完,即3a + 8b + 11c = n。
- 在满足第一个条件的前提下,尽可能多地购买成套的零食,即a、b、c 中的最小值尽可能大。
- 在满足以上两个条件的前提下,尽可能多地购买总数更多的零食,即a+b+c 尽可能大。
请帮助阿短找出符合条件的最优方案。可以证明,如果存在解决方案,那么最优方案是唯一的。
输入一行一个整数 n 表示阿短的口袋里的钱0≤n≤2∗10^5。
若方案不存在则输出−1。
否则输出一行三个用空格分隔的非负整数b, c表示答案。
输入样例 1
1
输出样例 1
-1
输入样例 2
22
输出样例 2
1 1 1
输入样例 3
36
输出样例 3
3 2 1
代码:
#include <bits/stdc++.h>
using namespace std;int main(){
int n;
cin >> n;
int maxt = -1, maxa, maxb, maxc, maxs;
for(int c = 0; c <= n / 11; c++){
for(int b = 0; b <= n / 8; b++){
double a = (n - 8 * b - 11 * c) / 3.0;
if(a >= 0 && a == (int)a){ //条件1 n元全部用完
int t = min(min((int)a, b), c);
if(t > maxt){ //条件2 套数尽可能多
maxt = t;
maxa = a;
maxb = b;
maxc = c;
maxs = a + b + c;
}else if(t == maxt){ //条件3 套数相同
int s = a + b + c;
if(s > maxs){ //总数尽可能多
maxa = a;
maxb = b;
maxc = c;
maxs = s;
}
}
}
}
}
if(maxt == -1){
cout << -1;
return 0;
}
cout << maxa << " " << maxb << " " << maxc;
return 0;
}