《买零食》

阿短的口袋里有 n 元钱,他想用这些钱买三种不同的零食:

  1. 薯片,每包 33 元。
  2. 巧克力棒,每个 88 元。
  3. 饼干,每盒 1111 元。

设薯片、巧克力棒和饼干的订购数量分别为a、b和c。小可的订购原则如下:

  1. 必须将所有的钱都用完,即3a + 8b + 11c = n。
  2. 在满足第一个条件的前提下,尽可能多地购买成套的零食,即a、b、c 中的最小值尽可能大。
  3. 在满足以上两个条件的前提下,尽可能多地购买总数更多的零食,即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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值