幸運的袋子

2021-08-24 18:17:11 字數 1292 閱讀 8899

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

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

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

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

第二行為n個數正整數xi(xi ≤ 1000)

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

1 1 1

2
說實話,對於牛客網上的程式設計題,或者其他上邊的程式設計題,我個人來說是很少往遞迴上面考慮的,因為遞迴很容易溢位,而且速度慢,多半不能滿足要求,但是下面的題目卻要使用遞迴來解決,如果有非遞迴的解決辦法,還請指出。

題目要求 袋子裡的數滿足  和大於成績,給出n個數,要求其中有多少個子集滿足這樣的條件,採用列舉法來看下這個問題:

個數                                   

方案數、要求              

2必須有乙個數為1,(1,1)、(1,2).....(1,999)

3(1,1,1)、(1,1,2)、....、(1,1,999)

4(1,1,1,1)、(1,1,1,2)、...、(1,1,1,999),(1,1,2,2),(1,1,2,3)

結論:①假設a1,a2,...ak,如果不滿足給定條件,即和sum小於等於積pi,如果此時再選擇乙個數b,能使其滿足sum+b > pi*b,則,b必然為1   ② 袋子中必須有1  

所以我們首先進行排序,將輸入的數進行有序,才能夠進行剪枝,如果sum>p,滿足sum+b

#include#includeusing namespace std;

int n;

int *x=null;

int count(int pos,int add,long long mul)

sort(x,x+n);

int num=count(0,add,mul);

cout<

if(x!=null)

return 0;

}

幸運的袋子

乙個袋子裡面有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個,但是別移除完 要使移除後的袋...