題意:中文題目,不解釋。。。
題解:第一種方法是暴力深搜:列舉盤子1~n放蘋果數量的所有情況,不需要剪枝;將每次列舉的情況,即每個盤的蘋果數量,以字典序排序,然後存進set裡 以此去重像"5 1 1"和"1 5 1"這種相同情況。
1/**2* @author wixson3*/
4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include
15const
int inf=0x3f3f3f3f;16
const
double pi=acos(-1.0
);17
const
double eps=1e-8;18
using
namespace
std;
19 typedef long
long
ll;20 typedef pairp;
2122
intn,m;
23set
s;24set
::iterator ite;
25int
ans;
26char str[12
];27
void dfs(int pos,int
left)
2839
return;40
}41//42
for(int i=0;i<=left;i++)
4347}48
intmain()
4961
return0;
62 }
第二種方法: 遞推。利用dp的思想,來看下樣例:將7個蘋果放進3個盤子裡,可以分2種情況考慮:1.空著乙個盤子不放,即將7個蘋果放進2個盤子裡;2.先每個盤子均放進乙個蘋果,然後將剩下的4個蘋果放進3個盤子裡。即dp[m][n]=dp[m-1][n]+dp[m-n][n](m>=n), 另外,顯而易見 dp[m][n]=dp[m][m](m
1/**2* @author wixson3*/
4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include
15const
int inf=0x3f3f3f3f;16
const
double pi=acos(-1.0
);17
const
double eps=1e-8;18
using
namespace
std;
19 typedef long
long
ll;20 typedef pairp;
2122
intn,m;
23int dp(int m,int
n)24
29int
main()
3039
return0;
40 }
POJ1664 放蘋果(整數劃分)
description 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。input 第一行是測試資料的數目t 0 t 20 以下每行均包含二個整數m和n,以空格分開。1 m,n 10。output 對輸入的每組資料m...
poj1664放蘋果 遞迴
放蘋果time limit 1000ms memory limit 10000k total submissions 23149 accepted 14694 description 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1...
poj 1664 放蘋果 遞推
解題思路 我們不妨令f m,n 表示m個蘋果放到n個盤子裡有多少種放法,下面對不同的情況給予討論 1 當盤子數為1的時候,只有一種放法就是把所有蘋果放到乙個盤子裡。2 當蘋果數為0的時候,也只有一種放法。3 當m n時,也分兩種情況討論,一種是至少有乙個盤子裡不放蘋果,這樣子就相當於f m,n 1 ...