理解了这道题 , 我感觉对背包又有了一个更深的认识 ……
HDU 2159
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std ;
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
int obtain[105] , reduce[105] ;
int dp[105][105] ;
int main ( ) {
    int n , m , K , s ;
    int a , b , i , j , k ;
    while ( cin >> n >> m >> K >> s ) {
        for ( i = 1 ; i <= K ; i++ ) {
            cin >> obtain[i] >> reduce[i] ;
        }
        int sign = 1 ;
        memset ( dp , 0 , sizeof(dp) ) ;
        for ( i = 1 ; i <= m ; i++ ) {
            for ( j = 1 ; j <= K ; j++ ) {
                for ( k = 1 ; k <= s ; k++ ) {
                    if ( reduce[j] <= i )
                        dp[i][k] = Max ( dp[i][k] , dp[i-reduce[j]][k-1]+obtain[j] ) ;
                }
            }
            if ( dp[i][s] >= n ) {
                cout << m-i << endl ;
                sign = 0 ;
                break ;
            }
        }
        if ( sign ) cout << -1 << endl ;
    }
    return 0 ;
}
原文:http://www.cnblogs.com/ccut-ry/p/7372016.html