M-湫湫系列故事———减肥记I
这个是模板题,但是一定要注意数组的大小,太小就超时,少了一个零的就容易程序崩溃。
#include<iostream> #include<cstring> #include<cmath> using namespace std; int dp[100005],a[105][2]; int max(int a,int b) { return a>b?a:b; } int main() { int n; while(cin>>n) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) cin>>a[i][0]>>a[i][1]; int m; cin>>m; for(int i=0;i<=n;i++) for(int v=a[i][1];v<=m;v++) dp[v]=max(dp[v],dp[v-a[i][1]]+a[i][0]); cout<<dp[m]<<endl; } return 0; }
for(int i=0;i<=n;i++) for(int v=a[i][1];v<=m;v++) dp[v]=max(dp[v],dp[v-a[i][1]]+a[i][0]); //这个是状态方程,切记是个状态改变量是卡路里!!!!!