您的位置:首页 > 其它

poj 2522 Partitioning for fun and profit

2012-08-20 09:01 549 查看
dp计数问题,

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

#define M 500
#define N 100
int  dp[M]
[M];//和,位数,首向量

bool vis[M]
[M];

int getdp(int m,int n,int x)
{
if(m<x)return 0;
if(vis[m]
[x])return dp[m]
[x];
vis[m]
[x]=true;
if(n==1)
{
if(x==m)dp[m]
[x]=1;
else dp[m]
[x]=0;
}
else {
int ans=0;
for(int i=x;i<=m-x;i++)
ans+=getdp(m-x,n-1,i);
dp[m]
[x]=ans;
}
return dp[m]
[x];
}

void dfs(int m,int n,int k,int pre)
{
if(m<=0||k<=0||n<=0){return;}
for(int i=pre;i<=m;i++)
{
int d=getdp(m,n,i);
if(d<k){
k-=d;
}
else
{
printf("%d\n",i);
dfs(m-i,n-1,k,i);
//	cout<<dp[m]
[i]<<'!'<<endl;
break;
}
}
}

int main()
{
int C;
scanf("%d",&C);
int m,n,k;
while(C--)
{
scanf("%d%d%d",&m,&n,&k);
dfs(m,n,k,1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fun c