http://acm.hdu.edu.cn/showproblem.php?pid=2159

二维费用的背包

wa了好多次,要求最大忍耐度,开始没处理好,想当然了

View Code
#include <iostream>
using namespace std ;
int dp[101][101] ;
int w[101],c[101] ;
int main()
{
    int n,m,k,s ;
    while(~scanf("%d%d%d%d",&n,&m,&k,&s))
    {
        for(int i=0;i<k;i++)
            scanf("%d%d",&w[i],&c[i]) ;
        memset(dp,0,sizeof(dp)) ;
        int flag=0 ;
        int cnt=INT_MAX ;
        for(int i=0;i<k;i++)
            for(int j=c[i];j<=m;j++)
                for(int k=1;k<=s;k++)
                {
                    dp[j][k]=max(dp[j][k],dp[j-c[i]][k-1]+w[i]) ;
                    if(dp[j][k]>=n)
                    {
                        if(cnt>j)
                        {
                            flag=1 ;
                            cnt=j ;
                        }
                    }
                }
        if(flag)
            printf("%d\n",m-cnt) ;
        else
            puts("-1") ;
    }
    return 0 ;
}