这道题一看就知道是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 }
浙公网安备 33010602011771号