hdu 2159 二维完全背包

来源:互联网 发布:厦大吴春明 知乎 编辑:程序博客网 时间:2024/04/30 08:21
/*dp[j][l] = Max(dp[j][l],dp[j-c[i]][l-1]+w[i])它表示  用掉了j点的忍耐度,并且杀了l个怪后,所获得的最大经验数。*/#include<cstdio>#include<cmath>#include<cstring>#include<iostream>using namespace std;#define MAX(a, b) (a) > (b) ? (a) : (b)const int LEN = 105;int dp[LEN][LEN], a[LEN], b[LEN], n, k, s, m;int main(){int i, j, l;while( scanf("%d%d%d%d", &n, &m, &k, &s)!=EOF ){for(i=0; i<k; i++){scanf("%d%d", &a[i], &b[i]);}memset(dp, 0, sizeof(dp));for(i=0; i<k; i++){for(j=b[i]; j<=m; j++){for(l=1; l<=s; l++){dp[j][l]=MAX(dp[j][l], dp[j-b[i]][l-1]+a[i]);}}}int flag=0, locate;for(i=0; i<=m; i++){for(j=0; j<=s; j++){if( dp[i][j] >= n ){flag=1;locate=i;break;}}if( flag )break;}if( flag )printf("%d\n", m-locate);elseprintf("-1\n");}return 0;}

原创粉丝点击