蓝桥杯算法训练:最大体积java

试题 算法训练 最大体积

每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积。假如每个物品有无限件可用,那么有些体积是永远也装不出来的。为了尽量装满背包,附中的OIER想要研究一下物品不能装出的最大体积。题目保证有解,如果是有限解,保证不超过2,000,000,000
  如果是无限解,则输出0
输入格式
  第一行一个整数n(n<=10),表示物品的件数
  第2行到N+1行: 每件物品的体积(1<= <=500)
输出格式
  一个整数ans,表示不能用这些物品得到的最大体积。
样例输入
3
3
6
10
样例输出
17

思路

其实就是算n个数字不能组成的最大体积中的最小值
在这里插入图片描述此处要分两种情况:
1:如果所有数字的最大公约数不为1,则有无数解,输出0
2:如果所有数字的最大公约数为1,那么则有有限解

import java.util.Scanner;

public class zuidatiji {
    static int n;
    static int[] vol;
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        n=s.nextInt();
        int[] arr=new int[n+1];
        vol=new int[100001];
        for (int i=1;i<=n;i++){
            arr[i]=s.nextInt();
            if (arr[i]==1){//如果有一个数为1,则所有体积均可构成
                System.out.println(0);
                return;
            }
        }
        if (n==1||valueall(arr)!=1){
            System.out.println("0");
            return;
        }else {
            vol[0]=1;
           for (int i=1;i<=n;i++){
                for (int j=arr[i];j<=100000;j++){
                    if (vol[j-arr[i]]==1){
                        vol[j]=1;
                    }
                }
           }
           for(int i=100000;i>=0;i--){
               if (vol[i]!=1){
                   System.out.println(i);
                   break;
               }
           }
        }
    }
    public static int valueone(int a,int b){//求最大公约数
        if (a%b==0){
            return b;
        }else {
            return valueone(b,a%b);
        }
    }

    private static int valueall(int[] arr) {//求所有数的公约数
      int temp=valueone(arr[1],arr[2]);
      for (int i=1;i<n;i++){
          temp=valueone(temp,arr[i+1]);
      }
      return temp;
    }


}


发布了11 篇原创文章 · 获赞 0 · 访问量 150

猜你喜欢

转载自blog.csdn.net/Kim_Linshuo/article/details/105685428
今日推荐