今天复习了一下dp,
dp实质上是记忆化的搜索,可参考https://blog.csdn.net/baidu_28312631/article/details/47418773
重新理解了一下01背包二维转一维
for(int i=1;i<=n;i++)
for(int j=n;j>=w[i];j–)//此处倒顺序是为了防止重复更新第i维,本质上空间压缩是基于找第i-1维的费用表,j从大到小保证对于第i维只更新了一次.
f[i]=max(f[i],f[i-j]+v[j])
可参考
https://blog.csdn.net/weixin_41061962/article/details/80319436
好题
小明打联盟
#include<cstdio>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int n=1e5+10;
long long v[10],w[10];
long long dp[n];
int main(){
int W;
while (cin>>W){
memset(dp,0,sizeof(dp));
for (int i=0;i<3;i++){
cin>>v[i]>>w[i];
}
int l,r,t,a;
cin>>l>>r>>t>>a;
v[3]=l;w[3]=t;v[4]=r;w[4]=(r-l)*a+t;
for (int i=0;i<5;i++)
{
for (int j=v[i];j<=W;j++)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
for (int i=l;i<=r;i++)
dp[W]=max(dp[W],dp[W-i]+t+(i-l)*a);
printf("%lld\n",dp[W]);
}
return 0;
}