H题
- 思路
二维背包,比较裸还是。
f [ i ] [ j ] [ k ] = m a x ( f [ i ] [ j ] [ k ] , f [ i − 1 ] [ j − h [ i ] ] [ k − s [ i ] ] + v [ i ] ) f[i][j][k]=max(f[i][j][k],f[i-1][j-h[i]][k-s[i]]+v[i]) f[i][j][k]=max(f[i][j][k],f[i−1][j−h[i]][k−s[i]]+v[i])
注意题目中要求 S S S值不够的时候,可以采用 H H H值进行弥补,只需要保证 H H H值始终大于 0 0 0即可。
所以:要加一个判断;看代码。
- 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const int N = 1e5+10;
ll a[N],b[N];
void solve()
{
int n;cin>>n;
while(n--){
int x,y;cin>>x>>y;
}
}
ll w[N],g[N],v[N];
ll f[400][400];
int main()
{
#ifndef ONLINE_JUDGE
freopen("b.txt","r",stdin);
freopen("bout.txt","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll V,n,T;
cin>>n>>V>>T;
for(int i=1;i<=n;i++){
cin>>w[i]>>g[i]>>v[i];
}
for (int i = 1; i <= n; i++)
for (int j = V; j >= w[i]; j--)
for (int k = T; k >= 0; k--)
if(k-g[i]<=0){
int tt = j;
tt-=(g[i]-k);
if(tt>=w[i]){
f[j][k] = max(f[j][k], f[tt - w[i]][0] + v[i]);
//用H值弥补S值
}
}
else
f[j][k] = max(f[j][k], f[j - w[i]][k - g[i]] + v[i]);
cout<<f[V-1][T]<<endl;
}