HDU - 2159 FATE
忍耐度->容量,经验值->价值,输出达到价值n后的最大剩余容量。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 110;
int n,m,k,s,dp[N][N];
int w[N],c[N];
int main()
{
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF){
memset(dp,0,sizeof(dp));memset(w,0,sizeof(w));memset(c,0,sizeof(c));for(int i=0;i<k;i++) scanf("%d%d",&w[i],&c[i]);for(int i=0;i<k;i++)for(int j=1;j<=s;j++)for(int l=c[i];l<=m;l++)dp[j][l]=max(dp[j][l],dp[j-1][l-c[i]]+w[i]);int i;for(i=0;i<=m;i++) if(dp[s][i]>=n) break;if(i>m) printf("-1\n");else printf("%d\n",m-i);}return 0;
}