题目链接:http://codeforces.com/contest/1154
题目大意
给定n个东西的价值,
有m种优惠方式,
每种是个二元组,表示恰好买x个数可以
免费y个最便宜的,问恰好买k个物品的最小花费是多少.
题目分析
由于k数据范围很小,
我们从k这个维度思考.
首先贪心的把商品按价值排序,
然后把每种决策用一维数组映射出来,明显对于一样的x
我们选y最大的,而没有用到的x就是0填充,
这样背包模型就构成了.
对于特定的容量i,我们可以对这个状态用所有的决策去扩充,
而产生的费用可以通过预处理前缀和在O(1)时间内得到.
#include<bits/stdc++.h>
using namespace std;
#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define