1 条题解

  • 0
    @ 2025-10-10 19:27:28

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    int f[1010]={};
    int c[1010]={};
    int main()
    {
        int n=0;
        int num[10]={0,1,2,3,5,10,20};//先将砝码大小进行预处理
        for (int i=1;i<=6;i++)
        {
            int k;
            cin>>k;
            for (int j=1;j<=k;j++) 
                c[++n]=num[i];
        }
    	
    	//转换01背包
        f[0]=1;
        int sum=0,ans=0;
        for (int i=1;i<=n;i++)
            sum+=c[i];//求出01背包体积最大值
        for (int i=1;i<=n;i++)
            for (int j=sum;j>=c[i];j--)
                f[j]+=f[j-c[i]];//DP
        for (int i=1;i<=sum;i++)
            if (f[i]) ans++;//累加所有可能出现的方案总和
        cout<<"Total="<<ans;
        return 0;
    }
    

    Java :

    import java.util.Scanner;
     
    public class Main {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner scan = new Scanner(System.in);
    		int a[] = new int [6];
    		for (int i = 0; i < a.length; i++) {
    			a[i] = scan.nextInt();
    		}
    		int sum = a[0]*1 + a[1]*2 + a[2]*3 + a[3]*5 + a[4]*10 + a[5]*20;
    		int s[] = new int[sum+1];
    		int m = 0;
    		for (int i = 0; i <= a[0]; i++) {
    			for (int j = 0; j <= a[1]; j++) {
    				for (int j2 = 0; j2 <= a[2]; j2++) {
    					for (int k = 0; k <= a[3]; k++) {
    						for (int k2 = 0; k2 <= a[4]; k2++) {
    							for (int l = 0; l <= a[5]; l++) {
    								s[i*1 + j*2 + j2*3 + k*5 + k2*10 + l*20] = 1;
    							}
    						}
    					}
    				}
    			}
    		}
    		int ans = 0;
    		for (int i = 0; i < s.length; i++) {
    			if(s[i] == 1) {
    				ans++;
    			}
    		}
    		System.out.println("Total="+(ans-1));
    	}
     
    }
    
    
    • 1

    信息

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