zoukankan      html  css  js  c++  java
  • P1025 数的划分 dfs dp

      

    题目描述

    将整数nn分成kk份,且每份不能为空,任意两个方案不相同(不考虑顺序)。

    例如:n=7n=7,k=3k=3,下面三种分法被认为是相同的。

    1,1,51,1,5;
    1,5,11,5,1;
    5,1,15,1,1.

    问有多少种不同的分法。

    输入输出格式

    输入格式:

    n,kn,k (6<n le 2006<n200,2 le k le 62k6)

    输出格式:

    11个整数,即不同的分法。

    输入输出样例

    输入样例#1: 复制
    7 3
    
    输出样例#1: 复制
    4
    

    说明

    四种分法为:
    1,1,51,1,5;
    1,2,41,2,4;
    1,3,31,3,3;
    2,2,32,2,3.

    用dfs很简单:

    #include<cstdio>
    
    int n,k,cnt;
    
    void dfs(int last,int sum,int cur)
    {
        if(cur==k)
        {
            if(sum==n) cnt++;
            return;
        }
        for(int i=last;sum+i*(k-cur)<=n;i++)//剪枝,只用枚举到sum+i*(k-cur)<=n为止
            dfs(i,sum+i,cur+1);
    }
    
    int main()
    {
        scanf("%d%d",&n,&k);
        dfs(1,0,0);
        printf("%d",cnt);
    }
    View Code

    dp[i][j]代表数i被分成j份的数量

    转移方程 

    主要分为 有1 和无1  这两种就包含了所有的情况了!!!!!!

    有1  (分出一个1 即可)  dp[i][j]=dp[i-1][j-1];

    重点是无1 :

    dp[i][j]=dp[i-j][j]   意为 给后面dp[i-j][j]每个数字加上1即可了 保证了无1

    还有就是注意边界处理

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);i--)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 2147483647
    #define N 1500+5
    int dp[N][N];
    int main()
    {
        int n,k;
        RII(n,k);
        rep(i,1,n)
        dp[i][1]=1;
    
        rep(i,2,n)
        rep(j,2,k)
        if(i>j)
            dp[i][j]=dp[i-1][j-1]+dp[i-j][j];
        else dp[i][j]=dp[i-1][j-1];
    
        cout<<dp[n][k];
        return 0;
    }
    View Code
  • 相关阅读:
    伟东云学堂—几何画板学习
    京北鲤鱼----创客教育
    几何画板学习网站
    快乐的搬运工
    少儿编程网
    科技学堂 Arduino轻松学
    跟张老师学硬件arduino板
    科技学堂 Arduino传感器入门
    巧办网
    项目:git+gitlab+jenkins+ansible上线网站
  • 原文地址:https://www.cnblogs.com/bxd123/p/10690568.html
Copyright © 2011-2022 走看看