- 思路
二维背包,比较裸还是。
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即可。
所以:要加一个判断;看代码。
- 代码
#includeusing 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<



