虽然一看就是dp 然并卵还是看了提示,学习了背包的几种变化
记录一下
#include<iostream>
#include <string>
#include<vector>
#include<algorithm>
#include<set>
#include<fstream>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =155;
const int inf = 20005;
int n,m;
int dp[35][inf];
int cost[35][maxnum];
int csum[35][maxnum];
int dam[35][maxnum];
int main()
{
//ifstream fin("G:/1.txt");
scanf("%d%d",&n,&m);
int A,B;
ms(csum);ms(cost);
ms(dam); ms(dp);
FOR(i,1,n){
scanf("%d%d",&A,&B);
if(B>m)continue;
cost[i][1]=csum[i][1]=B;
dam[i][1]=A;
for(int j=2;;j++){
cost[i][j]=cost[i][j-1]*1.07;
if(csum[i][j-1]+cost[i][j]>m){csum[i][0]=j-1;break;}
csum[i][j]=csum[i][j-1]+cost[i][j];
dam[i][j]=dam[i][j-1]+A;
}
}
FOR(i,1,n){
FOR(j,0,m){
dp[i][j]=max(dp[i-1][j],dp[i][j]);
FOR(k,1,csum[i][0]){
if(j<csum[i][k])continue;
dp[i][j]=max(dp[i][j],dp[i-1][j-csum[i][k]]+dam[i][k]);
}
}
}
int ans=0;
FOR(i,0,m)
ans = max(ans,dp[n][i]);
cout<<ans<<endl;
return 0;
}