试题 算法训练 最大体积
每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积。假如每个物品有无限件可用,那么有些体积是永远也装不出来的。为了尽量装满背包,附中的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;
}
}