[算法练习][枚举][c/c++]文具订购

                                                   文具订购

【题目描述】

小明的班上共有n 元班费,同学们准备使用班费集体购买3 种物品:
1. 圆规,每个7 元。
2. 笔,每支4 元。
3. 笔记本,每本3 元。
小明负责订购文具,设圆规,笔,笔记本的订购数量分别为a,b,c,他订购
的原则依次如下:
1. n 元钱必须正好用光,即7a+4b+3c=n。
2. 在满足以上条件情况下,成套的数量尽可能大,即a,b,c 中的最小值尽
可能大。
3. 在满足以上条件情况下,物品的总数尽可能大,即a+b+c 尽可能大。
请你帮助小明求出满足条件的最优方案。可以证明若存在方案,则最优方案
唯一。


【输入格式】

从文件order.in 中读入数据。
仅一行一个整数n 表示班费数量。
【输出格式】
输出到文件order.out 中。
若方案不存在则输出-1。否则输出一行三个用空格分隔的非负整数a,b,c
表示答案。
【样例1 输入】
1
【样例1 输出】
-1
【样例2 输入】
14
【样例2 输出】
1 1 1
【样例3 输入】
33
题目是复制的,先将就看,北京慧明教育科技发展有限公司祝您学习进步
【样例3 输出】
1 2 6
【样例3 解释】
a=2,b=4,c=1 也是满足条件1,2 的方案,但对于条件3,该方案只买了7
个物品,不如a=1,b=2,c=6 的方案。
【数据范围与提示】
对于测试点1 ~ 6:n ≤ 14。
对于测试点7 ~ 12:n 是14 的倍数。
对于测试点13 ~ 18:n ≤ 100。
对于所有测试点:0 ≤ n ≤ 105。
【时间限制】
1.0s
【空间限制】
256MB
题目是复制的,先将就看,北京慧明教育科技发展有限公司祝您学习进步
【上传文件】
上传c, cpp 或pas 语言源程序,文件名应依次为order.c, order.cpp,
order.pas。

 

 

#include <iostream>
#include <cstdio>
using namespace std;

int main(void)
{
    int n;
    cin >> n;

    if(0 == n)  //班费为0元时要特判
    {
        cout<<"0 0 0"<<endl;
        return 0;
    }

    for(int a = n / 14; a >= 0; a--)        //枚举最小值,即圆规的数量
    {
        for(int b = a; b <= (n-(a*7)) / 4; b++)      //枚举笔的数量
        {
            for(int c = a; c <= (n-(a*7)-b*4) / 3; c++) //枚举笔记本的数量
            {
                if(a * 7 + b * 4 + c * 3 == n)
                {
                    cout << a << " " << b << " " << c << endl;
                    return 0;
                }
            }
        }
    }

    cout << "-1" << endl;   //无解
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章