1 条题解

  • 0
    @ 2025-9-10 0:09:11

    C :

    #include "stdio.h"
    int a[]={1,2,3,5,10,20};
    int b[6],f[1001];
    int t,s;
    int main()
    {
    	int i,j,k;
    	s=t=0;
    	for(i=0;i<6;i++)
    	{
    		scanf("%d",&b[i]);
    		s+=a[i]*b[i];
    	}
    	f[0]=1;
    	for(i=0;i<6;i++)
    	{
    		if(b[i]==0)
    			continue;
    		k=1;
    		while(k<b[i])
    		{
    			for(j=s;j>=k*a[i];j--)
    			{
    				if(f[j])
    					continue;
    				if(f[j-k*a[i]])
    					f[j]=1,t++;
    			}
    			b[i]-=k;
    			k*=2;
    		}
    		k=b[i];
    		for(j=s;j>=k*a[i];j--)
    		{
    			if(f[j])
    				continue;
    			if(f[j-k*a[i]])
    				f[j]=1,t++;
    		}
    	}
    	printf("%d\n",t);
    	return 0;
    }
    

    C++ :

    #include<iostream>
    using namespace std;
    const int w[7]={0,1,2,3,5,10,20};
    int num[7],f[1001];
    bool can[1001];
    //ifstream cin("fama.in");
    //ofstream cout("fama.out");
    int main()
    {
        while (cin>>num[1]>>num[2]>>num[3]>>num[4]>>num[5]>>num[6])
        {   
            fill(can,can+1001,0);
            f[0]=1;  f[1]=0;  can[0]=true;
            for (int i=1;i<=6;i++)
            {
                int total=f[0];     //已经求出的重量数量 
                for (int j=1;j<=total;j++)
                    for (int k=1;k<=num[i];k++)                            
                        if  (!can[f[j]+k*w[i]])
                        {
                            can[f[j]+k*w[i]]=true;
                            f[0]++;
                            f[f[0]]=f[j]+k*w[i];
                        }           
            }
            cout<<f[0]-1<<endl;
        }
       // system("pause");
        return 0;
    }   
    

    Pascal :

    var
     w:array[1..6]of integer=(1,2,3,5,10,20);
     a:array[0..10000]of longint;
     b:array[0..1000]of boolean;
     max,ans,i,j,k:longint;
    begin
     for i:=1 to 6 do
      begin
       read(a[i]);
       max:=max+a[i]*w[i];
      end;
     fillchar(b,sizeof(b),false);
     b[0]:=true;
     for i:=1 to 6 do
      for j:=1 to a[i] do
       for k:=w[i] to max do
        if not(b[k]) then if b[k-w[i]] then b[k]:=true;
     for i:=1 to max do
      if b[i] then inc(ans);
     write(ans);
    end.
    
    • 1

    信息

    ID
    2919
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者