題目思路: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; }