zoj 3706 Break Standard Weight

/*题意:将两个砝码中的其中一个分成两块,三块组合最多有几种情况(可以只有一块,或者两块)。 
组合情况 i j m 三块砝码
(i+j)-m=m-(i+j) i+j i-j=j-i  i j m
(i+m)-j=j-(i+m) i+m i-m=m-i   i+j+m
(j+m)-i=i-(j+m) j+m j-m=m-j
*/
#include<string.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int he[405];/*砝码组合质量之和作为序号,来判断改质量是否已经访问过(防止有相同的质量再次使用)*/
int solove(int n,int m);
int main(int argc, char* argv[])
{
    int t,n,m,h,max;   
    
    scanf("%d",&t);
    while(t--)
    {
        
        scanf("%d%d",&n,&m);
        
        max=solove(n,m);/*当分n的时候,得到最大情况数量*/
        h=solove(m,n);/*当分m的时候,得到最大情况数量*/
        if(max<h)
            max=h;
        printf("%d\n",max);
        
    }
    return 0;
}
int solove(int n,int m)
{
    int i,j,max,count,t;
    max=count=0;
    for(i=1;i<=(n+1)/2;i++)/*因为1-n最后会有一半左右重复*/ 
            {
                    memset(he,0,sizeof(he));/*每一次砝码新的分法,这个数组需重新初始化*/ 
                    count=0;
                       j=n-i;
                       
                       t=i+j+m;
                    if(he[t]==0)
                    {he[t]=1;count++;}/*如果这个质量没有访问过组合数就加1,然后设置访问过*/ 
                    
                    t=abs(i+j-m);
                    if(he[t]==0)
                    {he[t]=1;count++;}
                    
                    t=abs(j+m-i);
                    if(he[t]==0)
                    {he[t]=1;count++;}
                    
                    t=abs(m+i-j);
                    if(he[t]==0)
                    {he[t]=1;count++;}
                    
                    t=i+m;
                    if(he[t]==0)
                    {he[t]=1;count++;} 
                    
                    t=i+j;
                    if(he[t]==0)
                    {he[t]=1;count++;}
                    
                    t=j+m;
                    if(he[t]==0)
                    {he[t]=1;count++;}
                    
                    t=abs(i-j);
                    if(he[t]==0)
                    {he[t]=1;count++;}
                    
                    t=abs(i-m);
                    if(he[t]==0)
                    {he[t]=1;count++;}
                    
                    t=abs(j-m);
                    if(he[t]==0)
                    {he[t]=1;count++;}
                    
                    t=i;
                    if(he[t]==0)
                    {he[t]=1;count++;}    
                    
                    t=j;                                            
                    if(he[t]==0)
                    {he[t]=1;count++;}
                    
                    t=m;
                    if(he[t]==0)
                    {he[t]=1;count++;}
                    
                    if(he[0]==1)/*如果有组合的结果是0,就不算在内*/
                    count--;
                    
                    if(max<count)
                    max=count;
            }
    return max;
}

 

posted @ 2014-03-10 20:05  keyboard3  阅读(269)  评论(0编辑  收藏  举报