今天复习了一下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;
}