标签:accept rip mem using math 多重背包 最大 for tle
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15224 Accepted Submission(s): 7203
题目大意:中文题目,就不说大意了………………
解题思路:对于这道题来说,背包中放的是经验,因此用耐力和杀怪的数量作为标准,当所得经验已经足够升级的时候就跳出循环。 我觉的可以理解为在完全背包的问题上限制了完全背包的数量,有一点多重背包的感觉,但因为所有的限制是有限的,所以用循环就不错感觉。所以就用了三层循环。
核心代码:
dp[i][l]=max(dp[i][l],dp[i-w[j]][l-1]+v[j]);//选择不打 和打 打的话就腾出这类怪物的耐久和可以打的怪物数量
附上代码:
#include <iostream> #include<math.h> #include <iomanip> #include<cstdio> #include<string> #include<map> #include<vector> #include<list> #include<algorithm> #include<stdlib.h> #include<iterator> #include<sstream> #include<string.h> #include<stdio.h> using namespace std; #define maxn 150 int dp[maxn][maxn];// dp[i][j] 表示在 i的忍耐度 j的刷怪范围 int v[maxn],w[maxn];//分别 第i种怪物 的经验和消耗的耐久 int main() { int n,m,k,s;//经验 忍耐 怪物的种类 最多少怪物数量 int i,j,l; while(cin>>n>>m>>k>>s) { int flag=0; memset(dp,0,sizeof(dp)); for(i=1;i<=k;i++) { cin>>v[i]>>w[i]; } for(i=1;i<=m;i++)//外层表示耐久 { for(j=1;j<=k;j++)//表示怪物种类 { for(l=1;l<=s;l++)//限制了个数 { if(w[j]<=i)//如果消耗比耐久少的话 { dp[i][l]=max(dp[i][l],dp[i-w[j]][l-1]+v[j]);//选择不打 和打 打的话就腾出这类怪物的耐久和可以打的怪物数量 } } } if(dp[i][s]>=n) { cout<<m-i<<endl; flag=1; break; } } if(flag==0) { cout<<"-1"<<endl; } } return 0; }
标签:accept rip mem using math 多重背包 最大 for tle
原文地址:http://www.cnblogs.com/William-xh/p/7373804.html