幸運的袋子

2021-08-06 02:51:45 字數 1181 閱讀 1811

乙個袋子裡面有n個球,每個球上面都有乙個號碼(擁有相同號碼的球是無區別的)。如果乙個袋子是幸運的當且僅當所有球的號碼的和大於所有球的號碼的積。

例如:如果袋子裡面的球的號碼是,這個袋子就是幸運的,因為1 + 1 + 2 + 3 > 1 * 1 * 2 * 3

你可以適當從袋子裡移除一些球(可以移除0個,但是別移除完),要使移除後的袋子是幸運的。現在讓你程式設計計算一下你可以獲得的多少種不同的幸運的袋子。

輸入描述:

第一行輸入乙個正整數n(n ≤ 1000) 第二行為n個數正整數xi(xi ≤ 1000)

輸出描述:

輸出可以產生的幸運的袋子數

如果直接遍歷每種組合來尋找則需要搜尋的空間過大,n個數一共有2^n個組合,程式複雜度過高。所以首先要根據條件進行剪枝:

首先考慮兩個數a+b>a*b,可以寫成1+x+1+y>(1+x)(1+y),1>xy,由於a,b為正整數,所以x,y必有乙個為0,所以a,b必有乙個為1。

當多個數時,如果sum

使用dfs進行深度遍歷搜尋,然後配合剪枝。

剪枝:先對輸入的陣列進行公升序排序,然後從兩個數組合開始,,…,,每次增加乙個數,直到不滿足要求時停止,因為後邊增加的數一定是大於等於ai的,無法滿足幸運袋子要求,這裡就完成剪枝。

最後還要注意處理重複的數字。

public

class main ;

arrays.sort(a);

int b = new

int[a.length];

int b_length=0;

b[0] = a[0];

b_length++;

dfs(a,b,1,b_length);

system.out.println(sum);

}static

int sum = 0;

public

static

void

dfs(int a,int b,int index,int b_length) else

b_length--;

flag = false;}}

}public

static

intcompute(int b,int b_length)

}

幸運的袋子

乙個袋子裡面有n個球,每個球上面都有乙個號碼 擁有相同號碼的球是無區別的 如果乙個袋子是幸運的當且僅當所有球的號碼的和大於所有球的號碼的積。例如 如果袋子裡面的球的號碼是,這個袋子就是幸運的,因為1 1 2 3 1 1 2 3 你可以適當從袋子裡移除一些球 可以移除0個,但是別移除完 要使移除後的袋...

幸運的袋子

乙個袋子裡面有n個球,每個球上面都有乙個號碼 擁有相同號碼的球是無區別的 如果乙個袋子是幸運的當且僅當所有球的號碼的和大於所有球的號碼的積。例如 如果袋子裡面的球的號碼是,這個袋子就是幸運的,因為1 1 2 3 1 1 2 3 你可以適當從袋子裡移除一些球 可以移除0個,但是別移除完 要使移除後的袋...

幸運的袋子

乙個袋子裡面有n個球,每個球上面都有乙個號碼 擁有相同號碼的球是無區別的 如果乙個袋子是幸運的當且僅當所有球的號碼的和大於所有球的號碼的積。例如 如果袋子裡面的球的號碼是,這個袋子就是幸運的,因為1 1 2 3 1 1 2 3 你可以適當從袋子裡移除一些球 可以移除0個,但是別移除完 要使移除後的袋...