曉萌希望將1到n的連續整數組成的集合劃分成兩個子集合,且保證每個集合的數字和是相等。例如,對於n=3,對應的集合能被劃分成 和 兩個子集合.
這兩個子集合中元素分別的和是相等的。
對於n=3,我們只有一種劃分方法,而對於n=7時,我們將有4種劃分的方案。
輸入包括一行,僅乙個整數,表示n的值(1≤n≤39)。
輸出包括一行,僅乙個整數,曉萌可以劃分對應n的集合的方案的個數。當沒發劃分時,輸出0。
樣例1輸入:
7輸出:
4自己推的話可以先看出 n = 6 和 n = 7 的時候是沒有相關性的;
我們用dp的思想來想 , 所謂求誰設誰;
我們設dp[i][j] i 表示 1 到 i ,j 表示 和為 j 的種類有多少;
先分種類 總數和為奇數的時候 輸出 0 這是大家能想到的;
當 i > j 的時候 因為 i > j 所以加不加上 j 都不會有多出來的情況 所以dp[i][j] = dp [i - 1][j]l;
當 i == j 的時候 i 剛好為 j 所以多出一種 所以dp[i][j] = dp[i - 1][j] + 1;
重點當i < j 的時候 會有j - i 加上 i 從而 == j 所以dp[i][j] = dp[i - 1][j] + dp[i - 1][j - i];就是加上前面 變成 j - i 有多少種類 ;
此時**的大致思想就已經出來了 下面我貼上程式;
#includeusing namespace std;
int main()else if(i == j)else
}} cout《還有一種dfs思想超時的 僅僅提供給大家思路用
#includeusing namespace std;
int n;
int summ = 0;
int h = 0;
void dfs(int t,int sum)
if(sum > summ - sum) return;
for(int i = t + 1; i <= n; i++)
}int main()
if(n <= 2) cout<< 0;
else
cout<} return 0;
}
計蒜客 等和的分隔子集
曉萌希望將1到n的連續整數組成的集合劃分成兩個子集合,且保證每個集合的數字和是相等。例如,對於n 3,對應的集合能被劃分成 和 兩個子集合.這兩個子集合中元素分別的和是相等的。對於n 3,我們只有一種劃分方法,而對於n 7時,我們將有4種劃分的方案。輸入包括一行,僅乙個整數,表示n的值 1 n 39...
計蒜客 節食的限制(01揹包)
bessie像她的諸多姊妹一樣,因為從farmer john的草地吃了太多美味的草而長出了太多的贅肉。所以fj將她置於乙個及其嚴格的節食計畫之中。她每天不能吃多過h 5 h 45,000 公斤的乾草。bessie只能吃一整捆乾草 當她開始吃一捆乾草的之後就再也停不下來了。她有乙個完整的n 1 n 5...
計蒜客 節食的限制(01揹包)
bessie像她的諸多姊妹一樣,因為從farmer john的草地吃了太多美味的草而長出了太多的贅肉。所以fj將她置於乙個及其嚴格的節食計畫之中。她每天不能吃多過h 5 h 45,000 公斤的乾草。bessie只能吃一整捆乾草 當她開始吃一捆乾草的之後就再也停不下來了。她有乙個完整的n 1 n 5...