题目描述
小明的班上共有 元班费,同学们准备使用班费集体购买 种物品:
圆规,每个 元。
笔,每支 元。
笔记本,每本 元。
小明负责订购文具,设圆规,笔,笔记本的订购数量分别为 他订购的原则依次如下:
元钱必须正好用光,即
在满足以上条件情况下,成套的数量尽可能大,即 中的最小值尽可能大。
在满足以上条件情况下,物品的总数尽可能大,即 尽可能大。
请你帮助小明求出满足条件的最优方案。可以证明若存在方案,则最优方案唯一。
输入格式输入仅一行一个整数,代表班费数量 。
输出格式如果问题无解,请输出 。
否则输出一行三个用空格隔开的整数 分别代表圆规、笔、笔记本的个数。
样例输入 #1
1
输出 #1
-1
输入 #2
14
输出 #2
1 1 1
输入 #3
33
输出 #3
1 2 6
数据范围与提示
样例输入输出 3 解释
也是满足条件 的方案,但对于条件 ,该方案只买了 个物品,不如 的方案。
数据规模与约定
对于测试点 ,保证 。
对于测试点 ,保证 是 的倍数。
对于测试点 ,保证 。
对于全部的测试点,保证 。
分类标签[2020] [NOIp 普及组]
C++题解代码
#include <bits/stdc++.h>
using namespace std;
int n;
int a;
int f;
int b;
int c;
int d;
int e;
int g;
int s1;
int s2;
int s3;
int fn(int x, int y, int z) {
if ((x < y) && (x < z)) {
return x;
} else if (y < z) {
return y;
} else {
return z;
}
}
// The main procedure
int main() {
cin>>n;
c = 0;
d = 0;
s1 = (-1);
for (int i = 0; i <= (n/7); i++) {
a = (n-(i*7));
for (int j = 0; j <= (a/4); j++) {
b = (a-(j*4));
if ((b%3) == 0) {
b = (b/3);
f = fn(i, j, b);
if (f > c) {
c = f;
s1 = i;
s2 = j;
s3 = b;
d = (i+(j+b));
} else if (f == c) {
g = (i+(j+b));
if (g > d) {
d = g;
s1 = i;
s2 = j;
s3 = b;
}
}
}
}
}
if (s1 == (-1)) {
cout<<"-1";
} else {
cout<<s1;
cout<<" ";
cout<<s2;
cout<<" ";
cout<<s3;
}
return 0;
}
Blockly题解代码图片