10 10 1 10 1 1 10 10 1 9 1 1 9 10 2 10 1 1 2 2
0 -1 1
学习了一下大神的思路。
思路:这题是一道典型的二维完全背包题,背包内所要储存的是经验,所以背包的容量便以忍耐度与杀怪数作为标准,每次得到背包价值的最大数与升级所需的经验作比较,能够升级就退出。
#include <iostream>
#include <string.h>
using namespace std;
struct node
{
int v, w;
}a[105];
int dp[105][105];
int main()
{
int n, m, k, s;
int x, y, z;
while(cin>>n>>m>>k>>s)//经验值,忍耐度,怪的种数和最多杀怪数
{
for(int i=1; i<=k; ++i)
cin>>a[i].v>>a[i].w;
memset(dp, 0, sizeof(dp));
for(x=1; x<=m; x++)
{
for(y=1; y<=k; ++y)
for(z=1; z<=s; ++z)
{
int st=1;
while(st*a[y].w<=x&&st<=z)
{
dp[x][z]=max(dp[x-st*a[y].w][z-st]+st*a[y].v,dp[x][z]);
st++;
}
}
if(dp[x][s]>=n)
break;
}
if(x>m)
cout<<-1<<endl;
else
cout<<m-x<<endl;
}
return 0;
}
原文地址:http://blog.csdn.net/wangxinxin_/article/details/44835821