这道题。。写了好久费了很大的劲..
这个动规不太好写啊。。。
#include<memory.h>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
struct node
{
int ni,mi;
} v[100];
int dp[100][100];
int main()
{
int n,m,k,s;
while(~scanf("%d %d %d %d",&n,&m,&k,&s))
{
memset(dp,0,sizeof(dp));
for(int i=0; i<k; i++)
{
scanf("%d %d",&v[i].ni,&v[i].mi);
}
int flag=0,i;
for(i=1; i<=m; i++)
{
for(int j=1; j<=s; j++)
{
for(int t=0; t<i; t++)
{
if(dp[t][j-1]==0)
{
for(int p=0; p<k; p++)
if(v[p].mi==i)
dp[i][j]=max(dp[i][j],v[p].ni);
}
else
{
int cnt=i-t;
for(int p=0; p<k; p++)
{
if(v[p].mi==cnt)
dp[i][j]=max(dp[i][j],dp[t][j-1]+v[p].ni);
}
}
}
}
if(dp[i][s]>=n)
{
flag=1;
break;
}
}
if(i>m)
printf("-1\n");
else
printf("%d\n",m-i);
}
return 0;
}