hdu 2159 fate 二维完全背包
分析:这是一个二维完全背包,首先要找到哪个属性是wight,哪个是value。。根据题意,杀怪数和忍耐度是wight,属于背包。经验值是价值。。然后套用完全背包,只不过这个是二维背包,要再加入一个循环。。这个题要求的是剩余忍耐度。。所以第一个循环可以设置成忍耐度。。只要所求的经验值大于规定,就可跳出循环,简化代码。。
#include<iostream> using namespace std; int dp[110][110]; int Max(int a,int b){ return a>b?a:b; } int main() { int i, j, k, n, m, l, s, a[105], b[105], sum; while(cin>>n>>m>>l>>s) { memset(dp, 0, sizeof(dp)); sum=-1; for(i=1; i<=l; i++) { cin>>a[i]>>b[i]; } for(i=1; i<=m; i++) { for(j=1; j<=l; j++) { for(k=1; k<=s; k++) { if(i>=b[j]) dp[i][k]=Max(dp[i][k], dp[i-b[j]][k-1]+a[j]); //需加入一个判断条件,因为第一个循环是忍耐度。 } } if(dp[i][s] >= n) { sum=m-i;break; } } cout<<sum<<endl; } return 0; }