题目链接
题面
题目大意
给出n件商品,m个优惠政策,计算购买k件商品最少花费多少。优惠政策为每买x件商品,最低的y件商品免费。优惠政策可搭配无限使用。
题目分析
购买k件商品,无论如何使用优惠政策 ,这k件商品一定是已知的n件商品中价格最低的k件商品。因此将商品价格排序,取价格最低的k件商品。由于优惠政策可随意使用,因此对这k件商品进行完全背包求解。求解价格时使用前缀和避免超时。最低价格即为优惠的商品价格最大时所需价格,最后用最低的k件商品价格总和减去最大优惠价格即为所求答案。(求和会报int。。。)
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5;
int num[2*maxn+50],cnt[2*maxn+50],val[2*maxn+50];
ll dp[2010],sum[2010];
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
}
for(int i=1;i<=m;i++){
scanf("%d%d",&cnt[i],&val[i]);
}
sort(num+1,num+n+1);
for(int i=1;i<=k;i++){
sum[i]=sum[i-1]+num[i];
}
for(int i=1;i<=k;i++){
for(int j=1;j<=m;j++){
if(i>=cnt[j]){
dp[i]=max(dp[i],dp[i-cnt[j]]+sum[i-cnt[j]+val[j]]-sum[i-cnt[j]]);
}
}
}
printf("%I64d\n",sum[k]-dp[k]);
return 0;
}