10 10 1 10 1 1 10 10 1 9 1 1 9 10 2 10 1 1 2 2
0 -1 1
學習了一下大神的思路。
思路:這題是一道典型的二維完全背包題,背包內所要儲存的是經驗,所以背包的容量便以忍耐度與殺怪數作為標准,每次得到背包價值的最大數與升級所需的經驗作比較,能夠升級就退出。
#include#include 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<