题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159
就是背包问题,不过状态不好想,也是参考了别人的才写出来的,状态解释见:http://zc634579757.blog.163.com/blog/static/12449746220100301430970/
觉得还是挺巧妙的,想问题时学会逆向思维可能会有出乎意料的效果啊,贴代码
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=100;
int n,m,k,s;
int e[maxn],p[maxn];///¾ÑéºÍÈÌÄͶÈ
int d[maxn][maxn];
int main()
{
int h,i,j;
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
{
for(i=0;i<k;i++)
scanf("%d%d",&e[i],&p[i]);
for(h=0;h<=m;h++)
for(i=0;i<=s;i++)
d[h][i]=0;
for(h=1;h<=m;h++)
{
for(i=1;i<=s;i++)
for(j=0;j<k;j++)
if(h>=p[j])
d[h][i]=max(d[h][i],d[h-p[j]][i-1]+e[j]);
if(d[h][s]>=n)
break;
}
printf("%d\n",m-h);
}
return 0;
}