题目链接
大意:给你n个物品和m种优惠方式,让你买k种,问最少多少钱。
思路:考虑 d p dp dp, d p [ x ] dp[x] dp[x]表示买 x x x种物品的最少花费,然后遍历 m m m种优惠方式就行转移就好了。

#include<bits/stdc++.h>

#define LL long long
#define fi first
#define se second
#define mp make_pair
#define pb push_back

using namespace std;

LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
LL lcm(LL a,LL b){return a/gcd(a,b)*b;}
LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
const int N = 2e5 +11;
int n,m,a[N],k;
struct uzi
{
	int a,b;
	bool operator <(const uzi & t)const{
		return b>t.b;
	}
}p[N];
LL dp[2033],s[N];
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	sort(a+1,a+1+n);
	for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
	for(int i=1;i<=m;i++)cin>>p[i].a>>p[i].b;
	for(int i=1;i<=k;i++){
		dp[i]=dp[i-1]+a[i];
		for(int j=1;j<=m;j++){
			if(p[j].a<=i){
				int l=i-p[j].a;
				dp[i]=min(dp[i],dp[i-p[j].a]+s[i]-s[l]+s[i-p[j].a]-s[i+p[j].b-p[j].a]);
			}
		}
	}
	cout<<dp[k]<<endl;
	return 0;
}