3 条题解
-
1
一道
大水题完全背包模板题rt,因为每种题目的数量不限,所以这道题使用完全背包dp。 那么这道题其实跟着五步走就行
- 划分阶段:我们以题目的种类和总耗时来划分
- 确定状态变量表示在时间段的最高得分
- 确定状态转移方程:对于每个都能通过推出(表示第种题目的耗时),所以我们可以推出状态转移方程为
dp[j]=max(dp[j],dp[j-t[i]]+p[i]
- 设定边界,因为要进行最大值比较,所以设~为0,但是如果声明的是全局数组,那么数组会自动将所有变量初始化为0
- ACCODE:
#include<iostream> using namespace std; int m,n,p[10001],t[10001],dp[10001];//三个数组分别表示每个种类的分值,每个种类的耗时,和在耗时i最多能拿多少分 int main() { cin>>m>>n; for(int i=1;i<=n;i++) { cin>>p[i]>>t[i]; } for(int i=1;i<=n;i++) { for(int j=t[i];j<=m;j++)//从t[i]开始,防止越界,到总时间m结束 { dp[j]=max(dp[j],dp[j-t[i]]+p[i]);//比较当前和从前面推来这两个分值的大小 } } cout<<dp[m]; }
信息
- ID
- 585
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 81
- 已通过
- 37
- 上传者