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;
}