完全背包,不过在最优值的选取上稍微有些不同。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[56000];
int main()
{
int n,h,mh,i,j,w[100],v[100];
memset(dp,0x7f,sizeof(dp));
scanf("%d%d",&n,&h);
for (i=0; i<n; i++)
{
scanf("%d%d",v+i,w+i);
}
dp[0]=0;
for (i=0; i<n; i++)
{
for (j=v[i]; j<=h+5000; j++)
{
if (dp[j] >= dp[j-v[i]]+w[i])
dp[j]=dp[j-v[i]]+w[i];
}
}
for (i=h+1; i<=h+5000; i++)
{
dp[h]=dp[h]>dp[i]?dp[i]:dp[h];
}
printf("%d\n",dp[h]);
}