幸運的袋子

2021-08-13 21:10:27 字數 1098 閱讀 6930

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

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

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

這個問題還是用dfs深度優化探索來解決:

定義兩個變數sum和multi,乙個用於求和,乙個用於求積

這裡仍然要用到遞迴的思想

1.最小問題為,不滿足這樣的條件,直接退出

2.若滿足,則繼續往下探索:例如:

1 1 滿足結論,就要繼續探索1 1 2滿足與否 1 1 2 滿足要繼續判斷 1 1 2 3是否滿足。

同時這些情況滿足的時候計數結果cnt++,直到劃為最小問題之後要重新判斷1 2  和1 3的情況,所以必須恢復到之前的情況。

於是有這樣一段程式:

sum-=a[i];

multi/=a[i];

3.1 1 2 3  中的1 1屬於無區別的球號,所以要跳過

for(;i但是有個問題就是輸入可能是1 2 1 3,所以在此之前務必要進行排序

完整程式如下:

#include

#include

#include

using namespace std;

const int n=10000;

int a[n];

int n;

int getnum(int a,int pos,long sum,long multi)

{int cnt=0;

for(int i=pos;imulti)  

cnt+=1+getnum(a,i+1,sum,multi);

else if(a[i]==1)//這裡很重要

cnt+=getnum(a,i+1,sum,multi);

else//最小問題

break;

sum-=a[i];

multi/=a[i];

for(;i0)

{for(int i=0;i

幸運的袋子

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