[算法練習][枚舉][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;
}

 

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