hdu 2159 背包问题
典型的背包问题,状态转移方程如下:
res[i][j] 表示用i的忍耐度杀j个怪兽获得的最大经验值。
res[i][j]=max(res[i-weight[k]][j-1]+value[k], res[i][j]);
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int weight[101],value[101],res[101][101];
int max(int a,int b)
{
return a > b ? a : b;
}
int work(int n,int m,int k,int s)
{
int i,j,l;
for(i=1;i<=m;i++)
for(j=1;j<=s;j++)
for(l=1;l<=k;l++)
if(i>=weight[l]) res[i][j]=max(res[i-weight[l]][j-1]+value[l],res[i][j]);
/*for(i=1;i<=m;i++)
{
for(j=1;j<=s;j++)
printf("%d ",res[i][j]);
printf("\n");
}*/
if(res[m][s] < n) return -1;
for(i=1;i<=m;i++)
for(j=1;j<=s;j++)
if(res[i][j] >= n) return m-i;
return 0;
}
int main()
{
int i,k,m,n,s;
while(scanf("%d %d %d %d",&n,&m,&k,&s)!=EOF)
{
memset(res,0,sizeof(res));
for(i=1;i<=k;i++)
scanf("%d %d",&value[i],&weight[i]);
printf("%d\n",work(n,m,k,s));
}
return 0;
}