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;
}
原文地址:https://www.cnblogs.com/wdt1/p/14586338.html