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