問題の--gift(DFS注文処理ツリーナップザック問題)を解決

問題の--gift(DFS注文処理ツリーナップザック問題)を解決

この質問神チェンマイコードをssw02参照
やはり2つのキャンパスランク-1の場合のシミュレーションゲームは、江神T1がハングアップ

ようこそ転載するssw02のブログ:https://www.cnblogs.com/ssw02/p/11640828.html

タイトル

制限付き木ナップザック問題:質問は、説明に直面します

入力:木の様々な制約+(属性)

最大値と消費の比率:出力

考え

この問題を解決する前に、この質問は、最初のオフ言う[JSOI2016]ベストグループ

まず、バイナリの回答(端数プログラミングルーチン01)[i]は= valのように、プロセス(バリュー - ミッド×で過ごしました)

ビット異なる伝達方程式DP。少なくとも一つの人員の制約のおかげと[i]を、私たちは考えるかもしれません、DP [i]はJ値[j]は、もはや項目のJの種類を選択していないが、個々のjはアイテムを受け取ったがあります。

その後、転送の問題を考慮し、我々はこのような状況を考えてみましょう。誰もが贈り物を持っている、そして今、いくつかの贈り物の手に。あなたはval>が拠出0アイテムの残りの部分を得ることができるように、我々は明らかに、最適値、確かに残っている剰余金の項目と、その後の人々の既存の記事に配布したいです。
そうdp[ 一个状态 ][ M ] = dp[ 前一个状态 ][ M ]

我々は唯一の、少なくともスタッフを考慮に入れると同時に、正当な答えは、速い制限のスタッフに到達しようとするために、我々は確かに取得しないサブアイテムの項目には、この記事のポイントを優先させて頂きます私たちは、上記より優れた選択肢項目の選挙後の完全な多くを持つことができるようになる人、。

簡単な例:あなたがいっぱいに埋めることができない場合は、しかし、例えば、全く個人的な項目5はありませんが、あなたは2ヴァル5、-10を持っているこの時間は、項目の数34、あなたはどのような場合には避けることができませんvalが物品に負から選択され、ケースを自由に選択することができる充填されています。(Ssw02のみ胡口、感情的な正しさの分析)

そして、タイムリーな依存関係ツリーのナップザック問題があります。

私たちは、私はjのサブツリー個人が贈り物を持っている[I] [J]プロセスに木のバックパックのDPを使用する通常の実施を検討することができます。

DFSのシーケンスは、依存関係を属性するシーケンスを変換するために使用することができます。選択されていないサブツリージャンプ動作の.DPを使用した[i] [j]はポストを表して配列のi jは個人本件をDFS。

コード

チェンマイ神ssw02参照コードは、DPのDFSが書かれた小さな一定のシーケンスを選択し、このアプローチのフラッシュバックの列挙および列挙順序は、本質的な違いはありません

#include<bits/stdc++.h>
using namespace std ;
#define ll long long
const int MAXN = 1005 ;
inline int read(){
    int s=0 ; char g=getchar() ; while(g>'9'||g<'0')g=getchar() ;
    while(g>='0'&&g<='9')s=s*10+g-'0',g=getchar() ; return s ;
}
int N , K ; 
double p[ MAXN ] , s[ MAXN ] , val[ MAXN ] , dp[ MAXN ][ MAXN ];
int  tot = 1 , spread[ MAXN ], head[ MAXN ] , to[ MAXN*2 ] , nex[ MAXN*2 ] ;
int  cnt = 0 , dfn[ MAXN ] , id[ MAXN ], size[ MAXN ] ;
void  add( int x , int y ){
    to[ ++tot ] = y , nex[ tot ] = head[ x ] , head[ x ] = tot ;
}
inline void  dfs( int u , int fa ){//从0开始只是因为树根为 0 , 刨除贡献 
    dfn[ u ] = cnt , id[ cnt++ ] = u , size[ u ] = 1 ;
    for( int i = head[ u ] ; i ; i = nex[ i ] ){
        dfs( to[ i ] , u  ) ;
        size[ u ] += size[ to[ i ] ] ;
    }
    return ;
} 
inline bool check( double x ){
    for( int i = 1 ; i <= N ; ++i )val[ i ] = p[ i ] - x*s[ i ] ;
    dp[ N+1 ][ 0 ] = 0 ;
    for( int i = 1; i <= K ; ++i ) dp[ N+1 ][ i ] = -1e9 ;
    for( int i = N ; i > 0 ; --i ){
        int u = id[ i ];
        for( int j = 0 ; j <= K ; ++j ){
            dp[ i ][ j ] = dp[ i+size[ u ] ][ j ] ;
            if(j <= spread[u] ){
                if(dp[i+1][0]+val[u]>dp[i][j])
                {
                    dp[i][j]=dp[i+1][0]+val[u];
                }
            }
            else
            {
                if(dp[i+1][j-spread[u]]+val[u]>dp[i][j])
                {
                    dp[i][j]=dp[i+1][j-spread[u]]+val[u];
                }
            }
        }
    }
    return dp[ 1 ][ K ] >= 0 ;
}
/*错误代码
for( int i = 1 ; i <= N ; ++i )val[ i ] = p[ id[i] ] - x*s[ id[i] ] ;
    dp[ 0 ][ 0 ] = 0 ; 
    for( int j = 0 ; j <= K ; ++j )dp[ 0 ][ j ] = -1e8 ; 
    for( int i = 0 ; i <= N ; ++i )
       for( int j = 0 ; j <= min( i , K ) ; ++j ){
           if( j <= spread[ id[ i ] ] )
              dp[ i+1 ][ j+1 ] = max( dp[ i+1 ][ j+1 ] , dp[ i ][ 0 ]+val[ i ] ) ;
           else
              dp[ i+1 ][ j+1 ] = max( dp[ i+1 ][ j+1 ] , dp[ i+1 ][ j-spread[ id[i] ]] + val[ i ] ) ;
           dp[ i+size[ id[i] ] ][ j ] = max( dp[ i+size[ id[i] ] ][ j ] , dp[ i ][ j ] ) ;
       }
    return dp[ N+1 ][ K ] >= 0 ;
*/
void  dx( double l , double r ){
    while( r - l > 0.0000001 ){
        double mid = ( l+r )/2.0 ;
        if( check(mid) )l = mid ; else r = mid ; 
    }
    printf("%0.10lf",l) ;
}
int main(){ 
    //freopen("gift.in","r",stdin);
    //freopen("gift.out","w",stdout);
    N = read() , K = read() ; int m1 , m2 , m3 ; double ma = -1.0 ;
    for( register int i = 1 ; i <= N ; ++i ){
        spread[ i ] = read() , p[ i ] = 1.0*read() , s[ i ] = 1.0*read() , m3 = read() ; 
        add( m3 , i ) ; 
    }
    dfs( 0 , 0 ) ;
    val[ 0 ] = 0.0 ;
    dx( (double)0 , 100000 ) ; 
    return 0 ;
}

不十分な場合は、指摘してください。

おすすめ

転載: www.cnblogs.com/ssw02/p/11640828.html