想要最多的幸福感啊!!! 小z在旅行,他沿途按顺序经过n个项目,对每个项目他可以花费vi钱去玩,然后获得wi点幸福感,不过他有个特殊的条件,每次玩的项目一定不能比上一次玩的项目便宜,第一次玩的项目可以任意,同一个项目可以多次游玩,他出发的时候带了m元钱,想知道他这一次旅行最多能获得多少幸福感?
输入格式:
第一行输入两个正整数n,m,表示项目个数和初始携带的金钱。 接下来n行,每行两个数字v,w表示第i个项目的花费和幸福感 2≤n≤50 1≤m≤3000 1≤v≤50 1≤w≤1000
输出格式:
输出一行一个整数表示答案
输入样例:
2 5
3 6
2 5
输出样例:
10
思路:
1,一个游戏玩多次--完全背包
2,按顺序走,且花的钱不可变少---多加一维,从钱少的钱多的转移
代码:
#include<bits/stdc++.h>
using namespace std;
#define pu push_back
#define rep(i,m,n) for(int i=m;i<=n;++i)
const int maxj =1e8+1,mod = 998244353 ;
int v[100],w[100];
int dp[100][3500];
int main(){//完全背包
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n,m;
cin>>n>>m;
rep(i,1,n){
cin>>v[i]>>w[i];
}
//边界的处理
//有规则的限制,好多时候,多开一维,或者多维护一个循环
int ans=0;
rep(i,1,n){
rep(j,v[i],m){
rep(k,1,i){
if(v[i]<v[k])continue;
dp[i][j]=max(dp[i][j],dp[k][j-v[i]]+w[i]);//花z时刻剩下的钱,多现在i的价值
ans=max(ans,dp[i][j]);
}
}
}cout<<ans<<'\n';
return 0;
}