为什么所求的八个值不变化呢(标签-美食|关键词-字典序)




某餐厅厨师制作美食需要用到8种配料(盐、芥末、糖等),每种配料可以放15克,美食的美味度为所有配料质量之和。如果给定一个美味度 n,求解具有该美味度的8种配料的所有搭配方案及方案数量。

【输入形式】

一个正整数n(n<=100),表示美味度。

【输出形式】

1.方案总数=0,输出0;

2. 1<=方案总数<=5,按字典序排列输出所有搭配方案,最后一行输出方案总数;

3. 方案总数>5,按字典序排列输出前5种搭配方案,最后一行输出方案总数;

注:每行用空格隔开输出8种配料的质量,表示1种搭配方案。

#include<stdio.h>
int main(){
    int a1,a2,a3,a4,a5,a6,a7,a8;
    int n,count=0;
    scanf("%d",&n);
    for(a1=1;a1<=5;a1++){
        for(a2=1;a2<=5;a2++){
            for(a3=1;a3<=5;a3++){
                for(a4=1;a4<=5;a4++){
                    for(a5=1;a5<=5;a5++){
                        for(a6=1;a6<=5;a6++){
                            for(a7=1;a7<=5;a7++){
                                for(a8=1;a8<=5;a8++){
                                    
                                    if(a1+a2+a3+a4+a5+a6+a7+a8==n){
                                        count++;    
                                            
                                    }
                                    }
                                    
                                }
                            }
                        }
                    }
                }
            }
        }
        int num=count;
        for(a1=1;a1<=5;a1++){
        for(a2=1;a2<=5;a2++){
            for(a3=1;a3<=5;a3++){
                for(a4=1;a4<=5;a4++){
                    for(a5=1;a5<=5;a5++){
                        for(a6=1;a6<=5;a6++){
                            for(a7=1;a7<=5;a7++){
                                for(a8=1;a8<=5;a8++){
                                    
                                    if(a1+a2+a3+a4+a5+a6+a7+a8==n){
                                        while(num>5){
                                            for(int i=0;i<5;i++){
                                            
                                                printf("%d %d %d %d %d %d %d %d\n",a1,a2,a3,a4,a5,a6,a7,a8);
                                        }
                                            printf("%d",num);
                                            return 0;
                                        }
                                        while(num>=1&&num<=5){
                                            printf("%d",num);
                                            return 0;
                                        }
                                    }
                                    
                                }
                            }
                        }
                    }
                }
            }
        }
        
    }
    }


while(num>5)乍一看是个死循环,因为循环过程中num值不变
但是里面又写了个return 0,只执行一次整个进程就结束了

  • 这篇博客: 7-8 美食节 (20 分)中的 数据规模和约定 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • N<=100000,M<=100000

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    int a[100000];
    int main()
    {
    	int n,m;
    	int x,y;
    	char c;
    	int count=0;
    	scanf("%d %d",&n,&m);
    	for(int i=1;i<=m;i++)
    	{
    		getchar();
    		
    		scanf("%c",&c);
    		if(c=='I')//排在队尾 
    		{
    			scanf("%d",&x);
    			a[count]=x;
    			count++;
    		}
    		else if(c=='C')
    		{
    			scanf("%d %d",&x,&y);
    			for(int i=0;i<count;i++)
    			{
    				if(a[i]==y)
    				{
    					for(int j=count;j>i;j--)
    					{
    						a[j]=a[j-1];
    					}
    					a[i]=x;
    				    break;
    				}
    				
    			}
    			count++;
    		 } 
    		 else if(c=='L')
    		 {
    		 	scanf("%d",&x);
    		 	for(int i=0;i<count;i++)
    			{
    				if(a[i]==x)
    				{
    					for(int j=i;j<count-1;j++)
    					{
    						a[j]=a[j+1];
    					}
    					break;
    				}
    			}
    			count--;
    		 }
    	}
    	if(count==0)
    	{
    		printf("Bai Ren Zhan\n");
    	}
    	else
    	{
    		for(int i=0;i<count;i++)
    		{
    			printf("%d ",a[i]);
    		}
    	}
    }
  • 以下回答由chatgpt基于相关博客总结生成:

    在美食方面的比较中可能涉及到字典序的相关概念。在程序中,指定的八个值不会发生改变的情况可能是指变量在存储到内存中时的大小端问题。可以通过编写代码来判断当前机器的字节序,例如:

    int check_system()
    {
        int a = 1;
        char* p = (char*)&a;
    
        return *p;    
    }
    

    这个函数会返回0或1,其中0表示big-endian大端字节序,1表示little-endian小端字节序。对于不同的字节序,需要在程序中进行相应的处理才能确保程序的正确性。