• HDU1059 Dividing


    这题  做了半天 ,明明 就是 套 模板的题,不知道 怎么老是WA...

    顺便说一下这题 还有DFS解法;

     1 #include<iostream>
     2  using namespace std;
     3  const int maxn = 10;
     4  int n[ maxn ];
     5  int sumv,V;
     6  int dp[ 60011 ];
     7  int max(int a,int b)
     8  {
     9      return a>b?a:b ;
    10  }
    11  void bag01( int cost,int weight ){
    12      for( int i=V;i>=cost;i-- ){
    13          dp[ i ]=max(dp[ i ],dp[ i-cost ]+weight);
    14      }
    15      return ;
    16  }
    17  void bagall( int cost ,int weight ){
    18     for( int i=cost;i<=V;i++ ){
    19         dp[ i ]=max( dp[ i ],dp[ i-cost ]+weight);
    20     }
    21      return ;
    22  }
    23  
    24 void mul_bag( int cost,int weight,int num ){
    25      if( cost*num>=V ){
    26          bagall( cost,weight );
    27          return ;
    28     }
    29      int k=1;
    30      while( k<=num ){
    31          bag01( k*cost,k*weight );
    32          num-=k;
    33          k*=2;
    34     }
    35      bag01( num*cost,num*weight );
    36      return ;
    37  }
    38  int main()
    39  {
    40      int i,k=1;
    41      while(cin>>n[0]>>n[1]>>n[2]>>n[3]>>n[4]>>n[5],n[0]+n[1]+n[2]+n[3]+n[4]+n[5])
    42      {
    43          memset(dp,0,sizeof(dp));
    44         sumv=n[0]+n[1]*2+n[2]*3+n[3]*4+n[4]*5+n[5]*6;
    45          if(sumv%2==1)
    46          {
    47              printf("Collection #%d:
    Can't be divided.
    
    ",k++);
    48              continue;
    49          }
    50          V=sumv/2;
    51         for(i=0;i<6;i++)
    52         {
    53              if(n[i]) mul_bag(i+1,i+1,n[i]);
    54         }
    55         if(V==dp[V]) printf("Collection #%d:
    Can be divided.
    
    ",k++);
    56          else printf("Collection #%d:
    Can't be divided.
    
    ",k++);
    57      }
    58      return 0;
    59  }

    这题的DFS解法.

     1 #include<iostream>  
     2 #include<cstdio>  
     3 using namespace std;  
     4 int halfvalue;  
     5 int a[7],sum,SUM,flag;  
     6   
     7 void dfs(int v,int pre) 
     8 {                        
     9     if(flag==1)    
    10         return;  
    11     if(v==halfvalue)  
    12     {  
    13         flag=1;  
    14         return;  
    15     }  
    16     for(int i=pre;i>=1;i--)  
    17     {  
    18        if(a[i]!=0)  
    19        {  
    20            if(v+i<=halfvalue)  
    21            {  
    22                a[i]--;//用过了就要减 
    23                dfs(v+i,i);  
    24                if(flag==1)  
    25                    break;  
    26            }  
    27        }  
    28     }  
    29     return;  
    30 }  
    31 int main()  
    32 {  
    33     int c=1;  
    34     while(1)  
    35     {  
    36         sum=0,SUM=0;  
    37         for(int i=1;i<=6;i++)  
    38         {  
    39             scanf("%d",&a[i]);  
    40             sum+=a[i];  
    41             SUM+=i*a[i];  
    42         }  
    43         if(sum==0)  
    44             break;  
    45         if(SUM%2==1)  
    46         {  
    47             printf("Collection #%d:
    Can't be divided.
    
    ",c++);  
    48             continue;  
    49         }  
    50         flag=0;  
    51         halfvalue=SUM/2;  
    52         dfs(0,6);  
    53         if(flag==1)  
    54             printf("Collection #%d:
    Can be divided.
    
    ",c++);  
    55         else  
    56             printf("Collection #%d:
    Can't be divided.
    
    ",c++);  
    57     }  
    58     system("pause");  
    59     return 0;  
    60 }
  • 相关阅读:
    一个很老的故事: 水和鱼的故事
    签到
    WEBPART结合实际的应用(.Net2005)
    Silverlight 3正式版新鲜出炉
    一个端口扫描的小程序
    带验证功能的的TextBox
    php解析url并得到url中的参数及获取url参数的四种方式
    Mysql外键约束设置使用方法
    require(): open_basedir restriction in effect. 解决方法
    PHP将变量存储在数据库中,读取并执行变量的方法
  • 原文地址:https://www.cnblogs.com/xiaoniuniu/p/3887189.html
Copyright © 2020-2023  润新知