http://acm.hdu.edu.cn/showproblem.php?pid=2159 DP方程:dp[i][k]=max(dp[i][k], dp[i - b[j]][k - 1] + a[j]); #include<stdio.h> #include<string.h> #include<math.h> #include<iostream> using namespace std; int main() { int n, m, s, i, j, k, K, a[101], b[101], dp[101][101]; while (scanf("%d %d %d %d", &n, &m, &K, &s) != EOF) { for (i = 1; i <= K; i++) scanf("%d %d", &a[i], &b[i]); memset(dp, 0, sizeof (dp)); for (i = 1; i <= m; i++) { for (k = 1; k <= s; k++) for (j = 1; j <= K; j++) if (i >= b[j])dp[i][k] = max(dp[i][k], dp[i - b[j]][k - 1] + a[j]); if (dp[i][s] >= n) break; } printf("%d/n", m - i); } return 0; }