dp【j】【kk】 = max(dp【j】【i】,dp【j-a[i].cost】【kk-1】+dp【a[i].vla】);
j个空间里放kk个获得的最大的价值
比一般的完全背包多了一层循环,因为要最多k件
找的时候只要找到第一次>=n的时候就可以了
10 10 1 10 1 1 10 10 1 9 1 1 9 10 2 10 1 1 2 2
0 -1 1
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <limits.h> #include <ctype.h> #include <string> #include <string.h> #include <math.h> #include <algorithm> #include <iostream> #include <queue> #include <stack> #include <deque> #include <vector> #include <set> #include <map> using namespace std; #define MAXN 100 + 10 int dp[MAXN][MAXN]; struct node{ int cost; int val; }a[MAXN]; int main(){ int n,m,k,s; int i,j,kk; while(~scanf("%d%d%d%d",&n,&m,&k,&s)){ memset(dp,0,sizeof(dp)); //printf("yes\n"); for(i=0;i<k;i++){ scanf("%d%d",&a[i].val,&a[i].cost); } for(i=0;i<k;i++){ for(j=a[i].cost;j<=m;j++){ for(kk=1;kk<=s;kk++){ dp[j][kk] = max(dp[j][kk],dp[j-a[i].cost][kk-1]+a[i].val); } } } int mark = 0; int ans; for(i=1;i<=m;i++){ for(j=1;j<=s;j++){ if(dp[i][j]>=n){ mark = 1; ans = i; break; } } if(mark == 1){ break; } } if(mark == 0){ printf("-1\n"); } else{ printf("%d\n",m-ans); } } return 0; } //dp[j][l] = Max(dp[j][l],dp[j-c[i]][l-1]+w[i]);
原文地址:http://blog.csdn.net/zcr_7/article/details/41362845