这道题一看就知道是01背包,我门用f[i]来表示时间剩余i时的最大的价值

一共只有两种选择取或者不取,可以得到方程式f[i]=max(f[i],f[i-a[i]]+v[i])(a[i]是表示时间,v[i]表示价值)

要注意枚举时间时要从后往前,因为动态规划是无后效性的。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     int n,m;
 5     cin>>n>>m;
 6     int a[111],v[111],f[1010]={0};
 7     for (int i=1;i<=m;i++)
 8         cin>>a[i]>>v[i];
 9     int oo=-1;
10     for (int i=1;i<=m;i++)
11         for (int j=n;j>=0;j--)
12           if (j-a[i]>=0)
13             f[j]=max(f[j],f[j-a[i]]+v[i]);
14      cout<<f[n]; 
15 }