LeeBlog

导航

HDU 2660 Accepted Necklace DFS || 多重背包

这题是以多重背包题..... 不过还不会多重... 只会简单的... 这里用DFS做就行了..... 不过这里如果不把当前位置传下去就会超时的噢... 我开始一直TLE  后来把当前状态传下去就A了

15MS

#include<stdio.h>
int V[25],W[25];
int des[25],n,k,we,max,dp[25][25];
int inf = 0x7fffffff;
void DFS( int p,int num,int val,int wei )//p不可少,否则超时.... 悲剧额....
{//以后做这种深搜的一定先考虑要不要传递当前状态.. 以此来减少深搜时间
     if( num == k || wei == we )
         if( val > max )
             max = val;
     for( int i = p; i <= n; ++i )
     {
          if( !des[i] )
              if( ( num + 1 <= k ) && ( wei + W[i] <= we ) )
              {
                  des[i] = 1;
                  DFS( i + 1,num + 1,val + V[i],wei + W[i] );
                  des[i] = 0;
              }
      }
 }
int main( )
{
    int t;
    scanf( "%d",&t );
    while( t-- )
    {
           max = 0;
            scanf( "%d%d",&n,&k );
            for( int i = 1; i <= n; ++i )
                 des[i] = 0,scanf( "%d%d",&V[i],&W[i] );
            scanf( "%d",&we );
            DFS( 0,0,0,0 );
            printf( "%d\n",max );
           }
    return 0;
}
/*
5 1
8 3
1 1
*/

posted on 2011-05-08 09:58  LeeBlog  阅读(300)  评论(0编辑  收藏  举报