放苹果

poj 1664 

题目大意:

解决:dfs,整数划分问题,

#include <iostream>
using namespace std;
int n,m,cnt;
int res[15];
bool check()
{
    for(int i=1;i<n;i++)
    if(res[i]<res[i-1])return false;
    return true;
}
void dfs(int deep,int cur_app,int p)
{
  //deep>n比不可少,本来以为不要也行,但是由于下边的条件不一定总是满足,
 //可能导致死循环了,所以很有必要独立写出一行
    if(deep>n)return;
    if(deep==n && cur_app==0 && check())
    { /*check函数的作用,由于511和115是同样的一种分配方法,但是都会出现,
所以按照一定的规则放,让不属于这个规则的其他的排列方式过滤掉就行了,
此处我用的是按照从大到小的顺序排放,先放大的,后放小的,就行了*/ cnt++; return; } for(int i=cur_app;i>=0;i--) { res[p]=i; dfs(deep+1,cur_app-i,p+1); } } int main() { int icase; cin>>icase; while(icase--) { cnt=0; cin>>m>>n; dfs(0,m,0); cout<<cnt<<endl; } system("pause"); return 0; }

原文地址:https://www.cnblogs.com/hpustudent/p/2172376.html