http://net.hpuacm.cf/problem/1021 不知道你们能不能用了。
Description
有nn种千里马,每一种都有若干匹,第ii种马的颜值a_iai,价格d_idi.现有mm个牧马人要去挑选千里马,每一位牧马人对马的颜值都有要求:{所选马的颜值总和} ⩾ Ai . 现在让你来为牧马人做满足要求的最低预算.
Input
单组测试数据,第一行两个整数n,m ( 1 ≤ n , m ≤ 1e4).
接下来nn行,每行两个整数 a1 , d1 , a2 , d2 , ... an , dn .
最后一行mm个整数 A1 , A2 , ... Am ,( 1 ≤ ai , di , Ai ≤ 1e4 ).
Output
输出mm个整数占一行,用空格隔开,表示每一位牧马人的最低花费.
Sample Input 1
2 2 1 2 2 1 5 5
Sample Output 1
3 3
此题用dp做,比赛的时候也没有做出来,看了别人的讲解才知道的,下面的代码是核心,他能求出在颜值要求的情况下的最小花费,具体的可以自己琢磨。
if(j<w[i]) dp[j]=min(dp[j],v[i]);
else dp[j]=min(dp[j],dp[j-w[i]]+v[i]);
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int w[10010],v[10010],dp[10010],g[10010];
int main()
{
int n,m,i,j,sum=0;
scanf("%d%d",&n,&m);
for(i = 1;i <= n; i++)
scanf("%d %d",&w[i],&v[i]);
memset(dp,INF,sizeof dp);
for(i = 1;i <= m; i++){
scanf("%d",&g[i]);
sum=max(sum,g[i]);
}
dp[0]=0;
for(i = 1;i <= n; i++)
for(j = 1;j <= sum; j++)
{
if(j<w[i])
dp[j]=min(dp[j],v[i]);
else
dp[j]=min(dp[j],dp[j-w[i]]+v[i]);
}
for(i = 1;i <= m; i++)
{
if(!(i-1))
printf("%d",dp[g[i]]);
else printf(" %d",dp[g[i]]);
}
return 0;
}