N题 第K大背包

来源:互联网 发布:智慧树台海网络电视台 编辑:程序博客网 时间:2024/05/01 08:17
#include<iostream>using namespace std;#include<cstdio>#include<cstring>int dp[205][205],c[200],w[200];int n,m,k,s;int main(){    int i,j;    while(cin>>n>>m>>k>>s)    {        memset(dp,0,sizeof(dp));        memset(c,0,sizeof(c));        for(i=1;i<=k;i++)        {            cin>>w[i]>>c[i];        }        for(i=1;i<=k;i++)        {             for(j=c[i];j<=m;j++)             {                 for(int p=1;p<=s;p++)                 {                     if(dp[p][j]<dp[p-1][j-c[i]]+w[i])                     {                        dp[p][j]=dp[p-1][j-c[i]]+w[i];                       // cout<<dp[p][j]<<endl;                     }                 }             }        }        int pan=0;        for(i=0;i<=m;i++)        {            if(dp[s][i]>=n)            {                pan=1;               cout<<m-i<<endl;                break;            }        }      //  cout<<endl;        if(!pan)            cout<<"-1"<<endl;    }    return 0;}

原创粉丝点击