//普通的01背包问题 //注意状态转移方程的写法 //时间够: 装与不装 dp[i][j]=max(dp[i-1][j],dp[i-1][j-times[i]]+weight[i]) //时间不够: 当前状态由 没有遍历到该物品时的最大价值相同 #include<iostream> #include<math.h> using namespace std; int dp[101][1001];//dp[i][j] 表示在j时间内有i件草药的前提下能采摘的最大价值。 int times[1001]; int weight[101]; int main(){ int T,M; cin>>T>>M; for(int i=1;i<=M;i++){ cin>>times[i]>>weight[i]; } for(int i=1;i<=M;i++){ //第i件草药 for(int j=1;j<=T;j++){ //j时间内 if(j>=times[i]){ dp[i][j]=max(dp[i-1][j],dp[i-1][j-times[i]]+weight[i]); }else{ dp[i][j]=dp[i-1][j]; } } } cout<<dp[M][T]; return 0; }