zoukankan      html  css  js  c++  java
  • b_wy_购买商品使得满减最省(01背包)

    满减活动是指用户单次购买的商品价格总数达到一定数额门槛T 后,会在下单结算时直接给用户减免一定的金额y,如常见的满1000减100活动。(为简化问题,每次结算最多只能减一次,如 满1000减100活动,当满2000时,也只能减一次100) 。而用户为了优惠的最大化,一般都会尽量控制购买的商品金额累计刚刚好超过满减要求数额T,超过的部分越小越好,从而获得最大的折扣力度。

    现有一个严选粉丝用户小王,他是一个要把优惠利用到极致的人。现在他购物车里有若干商品,并不要求一次性所有都买完,只是想趁着促销活动,把其中的部分商品先下一个订单,获取最大优惠即可。请你帮他计算,如何组合商品,可以满足他的要求。
    输入描述:
    第一行为满减活动的门槛T,为整数,0<T<100000
    第二行为满减活动的减去金额y,为整数,0<y<T
    第三行为小王购物车里的商品价格列表x0,X2...Xm, xi
    第三兰行为小王购物车里的商品价格列表Xo,X1,X2. .. .Xmu Xi 均为整数,用空格分隔,0<Xi<110000, 0<i<10000
    输出描述:
    小王该次下单,最后要实付的金额,为一一个整数

    100
    10
    47 59 42 54
    输出
    91
    经过计算,这次购买59+42-101,可以达到够门槛100的 最低额,减去优惠的10元,最后实付额为9 1
    
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        int T; cin>>T;
        int y; cin>>y;
        ll t, s; vector<ll> a;
        unordered_map<ll, int> f; f[0]=1;
        while (cin>>t) a.push_back(t), s+=t;
        for (int x : a)
        for (ll j=s; j>=x; j--)
            f[j]|=f[j-x];
        for (int i=T; i<=s; i++) {
            if (f[i]) {
                cout<<i-y;
                break;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    获取Spring容器中的Bean
    Log4j 配置 的webAppRootKey参数问题
    关于Eclipse项目中加入jquery.js文件报错(missing semicolon)问题
    SSO(单点登录)
    MySQL拷贝表的几种方式
    Maven的简介
    Maven 的41种骨架功能介绍
    Intellij IDEA 快捷键大全
    nginx基本配置与参数说明
    MYSQL和ORACLE的一些区别
  • 原文地址:https://www.cnblogs.com/wdt1/p/14586338.html
Copyright © 2011-2022 走看看