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;}