二维背包问题, 利用背包的最优思想逐步取最优
感觉还是对背包的思维不熟练
#include <iostream>
#include <cstring>
using namespace std;
#define N 110
int dp[N][N];
struct node
{
int jy, rn;
}p[N];
int main()
{
int n, m, k, s;
while(cin>>n>>m>>k>>s)
{
memset(dp,0,sizeof(dp));
for(int i=0;i<k;i++)
{
cin>>p[i].jy>>p[i].rn;
}
for(int i=0;i<k;i++)
{
for(int j=p[i].rn;j<=m;j++)
{
for(int q=1;q<=s;q++)
{
if(dp[j][q]<dp[j-p[i].rn][q-1]+p[i].jy)
{
dp[j][q]=dp[j-p[i].rn][q-1]+p[i].jy;
}
}
}
}
int flag=0;
for(int i=0;i<=m;i++)
{
if(dp[i][s]>=n)
{
flag=1;
cout<<m-i<<endl;
break;
}
}
if(flag==0)
{
cout<<-1<<endl;
}
}
return 0;
}