HDU 2159 FATE
在完全背包的基础上再多一维就好了
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; int v[105], r[105]; int dp[105][105]; //忍耐度,杀怪数 int main() { int n, i, j, k, s, m, l; while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF) { memset(dp,0,sizeof(dp)); for(i=0;i<k;i++) scanf("%d%d",&v[i],&r[i]); for(i=0;i<k;i++) { for(j=r[i];j<=m;j++) { for(l=1;l<=s;l++) { dp[j][l]=max(dp[j][l],dp[j-r[i]][l-1]+v[i]); } } } int ans=-1, left; for(i=0;i<=m;i++) { for(j=1;j<=s;j++) { if(ans==-1&&dp[i][j]>=n) { ans=dp[i][j]; left=i; break; } } if(ans!=-1) break; } if(ans==-1) puts("-1"); else printf("%d\n",m-left); } return 0; }