题目思路:c++
很明显的dp题,就是以天数做为阶段,而后里面套一个彻底背包,由于天天结束时会获得节点,因此在天数的循环最后还要加一个循环用来加上天天结束时获得的节点。spa
dp[u]表示如今有u个节点时最后能获得多少个节点,有几个地方要注意,首先是当前有的节点数要从2000开始循环,由于w[i]和k的范围是1000,假如说当前有1000个节点,那么又获得1000个节点,因此最多可能有2000个节点(大于k获得的节点是0)。其次是最后加上天天获得的节点数时要取一个最大值。最后答案要记得加上当前有的节点数。code
代码:blog
#include<bits/stdc++.h> using namespace std; int dp[10010],w[10010],n,m,k,ans; pair<int,int>p[101];//表明题目中的ai,bi int main() { memset(dp,128,sizeof(dp)); scanf("%d%d%d",&n,&m,&k); for(int i = 0;i<=k;i++) scanf("%d",&w[i]); for(int i = 1;i<=m;i++) scanf("%d%d",&p[i].first,&p[i].second); dp[0] = 0; for(int i = 1;i<=n;i++)//天数 { for(int j = 1;j<=m;j++)//存储方式 for(int u = 2000;u>=0;u--)//当前有的节点数 dp[u] = max(dp[u],dp[u+p[j].first]+p[j].second); for(int u = 2000;u>=0;u--)//加上当天结束获得的节点数 dp[u+w[u]] = max(dp[u+w[u]],dp[u]); } for(int i = 0;i<=2000;i++) ans = max(ans,dp[i]+i);//最后答案等于最后获得的节点加上当前有的节点 printf("%d",ans); return 0; }