描述
有n种千里马,每一种都有若干匹,第ii种马的颜值ai,价格di.现有m个牧马人要去挑选千里马,每一位牧马人对马的颜值都有要求:{所选马的颜值总和}⩾Ai.现在让你来为牧马人做满足要求的最低预算.
输入
单组测试数据,第一行两个整数n,m(1≤n,m≤1e4).
接下来n行,每行两个整数a1,d1,a2,d2,...an,dn.
最后一行m个整数A1,A2,...Am(1≤ai,di,Ai≤1e4).
输出
输出m个整数占一行,用空格隔开,表示每一位牧马人的最低花费.
输入样例 1
2 2 1 2 2 1 5 5
输出样例 1
3 3
#include<iostream>
#include<cstring>
using namespace std;
int a[150000];
int d[150000];
int peo[150000];
int dp[150000];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i]>>d[i];
}
int mmax=-1;
for(int i=0;i<m;i++){
cin>>peo[i];
mmax=max(mmax,peo[i]);
}
memset(dp,0x3f3f3f3f,sizeof(dp));
dp[0]=0;
for(int i=0;i<n;i++){
for(int j=1;j<=mmax;j++){
if(j>a[i])
dp[j]=min(dp[j],dp[j-a[i]]+d[i]);
else
dp[j]=min(d[i],dp[j]);
}
}
for(int i=0;i<m;i++){
if(i!=m-1){
cout<<dp[peo[i]]<<" ";
}
else
cout<<dp[peo[i]]<<endl;
}
return 0;
}