http://acm.hdu.edu.cn/showproblem.php?pid=2159
二维完全背包
方程f[s,m]=max(f[s,m],f[s-v[i],m-1]+m[i]);
v是疲劳度 m是经验值
找的时候疲劳度放外层循环找
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
int n,m,k,s;
int dp[105][105];
int num[105][2];
int main()
{
while(scanf("%d%d%d%d",&n,&m,&k,&s)==4)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=k;i++)
scanf("%d%d",&num[i][0],&num[i][1]);
int ok=0;
int i;
for(int j=1;j<=s;j++)
{
for(int v=1;v<=k;v++)
{
for( i=m;i-num[v][1]>=0;i--)
{
dp[i][j]=max(dp[i][j],dp[i-num[v][1]][j-1]+num[v][0]);
}
}
}
for( i=1;i<=m;i++)
{
for(int j=1;j<=s;j++)
{
if(dp[i][j]>=n)
{
ok=1;
break;
}
}
if(ok)
break;
}
if(ok)
printf("%d\n",m-i);
else
printf("-1\n");
}
}