样例对了10分代码求助

P1833 樱花

求解看哪几棵樱花树能使美学值最高且爱与愁大神能准时(或**提早**)去上学。——摘自题目描述
by GalilAR @ 2023-07-04 11:37:18


试一下,不要设置s[k]位并在把背包输入数据处理完后一起进行dp数组的更新。 而是在每个背包输入进来的时候就去进行dp数组的更新。你可以参考一下我的代码。 ```cpp #include <bits/stdc++.h> #include <cstdio> using namespace std; #define MAXN 10010 int t, h1, h2, m1, m2, m, w[MAXN], v[MAXN], idx; long long dp[1010]; int main(){ scanf("%d:%d %d:%d %d", &h1, &m1, &h2, &m2, &m); t = ( h2 - h1 )*60 + m2 - m1; for( int i = 0 ; i < m ; i ++ ){ int c = 1 , ww, vv, n; cin >> ww >> vv >> n; if( !n ) for( int j = ww ; j <= t ; j ++ ) dp[j] = max( dp[j] , dp[j - ww] + vv); else if( n == 1 ) for( int j = t ; j >= ww ; j -- ) dp[j] = max( dp[j] , dp[j - ww] + vv); else{ idx = 0; while( n > c ){ n -= c; w[ ++ idx ] = c * ww; v[ idx ] = c * vv; c *= 2; } w[ ++ idx ] = n * ww; v[ idx ] = n * vv; for( int i = 1 ; i <= idx ; i ++ ){ for( int j = t ; j >= w[i] ; j -- ){ dp[j] = max( dp[j] , dp[j - w[i]] + v[i] ); } } } } cout << dp[t] << endl; } ```
by Lycorisjzy @ 2023-07-29 20:44:00


谢谢大佬@[jzysama](/user/932956) AC了
by NsSe_ @ 2023-08-02 11:26:17


|