ファーウェイテスト分銅


分析:
分銅をそれぞれm 1、m 2......mnとする.彼らが取ることができる最大数はそれぞれx 1、x 2......xnである.どれだけの重さを量ることができるかを取得するには、それらのすべての組み合わせをそれぞれ加算する必要があります.Xの組み合わせがあると仮定し、それぞれ加算した結果はそれぞれX 1、X 2...XX.XからX 1からXXまでの等しい個数を減算します.
set集合に重複する数を格納してはいけないことを知っているので,hashsetで種々の組合せを格納して加算した結果を考慮し,最後にhashsetの大きさを求めると何種類と呼ぶことができるかを知ることができる.
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int num=scanner.nextInt();
		int []weight=new int[num];
		int []count=new int[num];
		
		for(int i=0;i<num;i++){
			weight[i]=scanner.nextInt();
		}
		for(int i=0;i<num;i++){
			count[i]=scanner.nextInt();
		}
		
		Set<Integer>set=new HashSet<Integer>();
		set.add(0);
		
		for(int i=0;i<num;i++){
			Object[]a=set.toArray();
			for(int j=1;j<=count[i];j++){
				for(int k=0;k<a.length;k++){
					Integer kk=(Integer)a[k]+weight[i]*j;
					set.add(kk);
				}
			}
			
		}
		System.out.print(set.size());
		
	}
}
コード解釈
int num=scanner.nextInt(); いくつかの異なる分銅を取得するために使用されます.
for(int i=0;i<num;i++){
			weight[i]=scanner.nextInt();
		}
は、分銅を格納するために使用される.
for(int i=0;i<num;i++){
			count[i]=scanner.nextInt();
		}
は、対応する分銅の最大数を格納する.
Set<Integer>set=new HashSet<Integer>();
		<strong>set.add(0)</strong>;
		
		for(int i=0;i<num;i++){
			<strong>Object[]a=set.toArray();// </strong>
			for(int j=1;j<=<strong>count[i]</strong>;j++){
				for(int k=0;k<a.length;k++){
					Integer kk=(Integer)a[k]+weight[i]*j;
					set.add(kk);
				}
			}
			
		}

1.i=0の場合
a[]={0}配列aには0要素のみがaの長さが1であることを同時に知り,j=1のとき3番目のforループに対して1回ループに相当する.kk=a[0]+m1;すなわちkk=0+m 1である.次にセットに追加し、2番目のforループがループするとj=1 kk=0+m 1となる.
              j=2                  kk=0+2 * m1               j=a[1]=x1        kk=0+x1 * m1
2.i=1の場合
a[]={0,m 1,2*m 1.....x 1*m 1}a配列にx 1+1個の数がある
j=1の場合,3番目のループに対してa配列の各数をそれぞれm 2加算し,集合に追加する.
a[]={0,     m1,         2*m1        .....   x1*m1,
       m2,  m1+m2,   2*m1+m2   .....   x1*m1+m2    }
j=2の場合,3番目のループに対してa配列の各数をそれぞれ2*m 2加算し,集合に追加するとaは
a[]={0,           m1,                2*m1        .....         x1*m1,         m2,               m1+m2,                2*m1+m2 .....              x1*m1+m2,
        2*m2     m1+2*m2,     2*m1+2*m2   ... x1*m1+2*m2 ,   m2+2*m2,     m1+m2+2*m2,   2*m1+m2+2*m2.....   x1*m1+m2+2*m2    } 
2番目のループについては,集合の各数にj*m 2をそれぞれ加算し,集合に追加する.
3.i=2の場合は1回類推