题解

245 条题解

  • 0
    @ 2006-09-26 20:49:49

    7=1+1+5=1+2+4=1+3+3=2+2+3

    每项减一:

    4=1+3=2+2=1+1+2

    所以f[n,k]:=f[n-k,k]+f[n-k,k-1]+f[n-k,k-2]+……+f[n-k,0]

    其中,除f[0,0]:=1以外,对其余正整数n有f[n,0]:=0;

    当j>i时,f:=0。

  • 0
    @ 2006-08-20 14:43:39

    递推式

    f:=f+f

  • 0
    @ 2006-08-19 08:39:24

    应该分成有1和没有1的情况

    f(i,j)表示i分成j份

    f(i,j):=f(i-1,j-1)+f(i-j,j);

  • 0
    @ 2006-08-16 01:51:03

    随便卡卡上界就可以搜过

    想想dp怎么弄...

  • 0
    @ 2006-08-13 18:00:55

    我直接递归试了下最后一个数据超了

    不知道楼上用的是什么方法~~

  • 0
    @ 2006-08-13 17:04:39

    直接递归哈!数据规模很小

  • 0
    @ 2006-07-23 14:37:52

    有人能将清楚点吗??

  • 0
    @ 2006-06-04 16:05:49

    c(0,0):=1;

    c(n,k):=c(n-k,k)+c(n-k,k-1)+...+c(n-k,0);

  • 0
    @ 2006-04-23 11:38:01

    自然数无序分拆公式(设把n分为k份为c(n,k))。

    c(n,k):=c(n-k,k)+c(n-k,k-1)...+c(n-k,1);

    c(n,1):=1;

    c(n,2):=n div 2.

  • -1
    @ 2019-07-30 22:58:12

    动态规划,以所分的数含不含1来递推,还是我的代码短^_^
    #include<iostream>
    #include<algorithm>
    using namespace std;

    int num[202][8];
    int getNum(int n,int k){
    if(n<k) return 0;
    if(k==1 || n==k) return 1;
    return num[n][k]=getNum(n-k,k)+getNum(n-1,k-1);
    }

    int main(){
    int n,k;
    cin>>n>>k;
    cout<<getNum(n,k)<<endl;
    return 0;
    }

  • -1
    @ 2018-08-07 09:02:35
    #include <bits/stdc++.h>
    using namespace std;
    #define FOR(i,n) for (int i=1;i<=n;i++)
    #define REP(i,a,b) for (int i=a;i<=b;i++)
    #define pb push_back
    #define mp make_pair
    #define ll long long
    const int N=10000+10;
    const int inf=0x3f3f3f3f;
    const ll mod=7654321;
    const double PI=3.1415926;
    const double eps=1e-8;
    
    int n,k;
    ll f[201][10];
    int main() {
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        cin>>n>>k;
        f[0][0]=1;
        FOR(i,n) FOR(j,k) {
            REP(l,0,j) if (i-l-(j-l)>=0) f[i][j]+=f[i-l-(j-l)][j-l];
            //cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
        }
        cout<<f[n][k]<<endl;
        
        return 0;
    }
    
  • -1
    @ 2018-03-29 19:47:49

    原来是s[k][n]的dp就够了啊,我用的是s[k][m][n],多了一个最大值。状态是前K个数,最大值为m,和为n的组合数量。不过这个规模O(k*n^2)也不太需要去考虑时间了。

  • -1
    @ 2017-08-01 15:18:55
    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    using namespace std;
    int n,k;
    int f(int a,int b,int c)
    {
        int g=0,i;
        if(b==1)
        g=1;
        else
        for(i=c;i<=a/b;i++)
        g+=f(a-i,b-1,i);
        return g;
    }
    int main()
    {
        cin>>n>>k;
        cout<<f(n,k,1);
        return 0;
    }
    
  • -1
    @ 2017-07-29 14:59:57
    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iomanip>
    #include <algorithm>
    #include <vector>
    #include <deque>
    #include <limits>
    #include <string>
    #include <sstream>
    using namespace std;
    
    const int oo_min=0xcfcfcfcf,oo_max=0x3f3f3f3f;
    
    int n,m;
    int f[200+1][6+1];
    
    int main()
    {
        while (~scanf("%d%d",&n,&m))
        {
            memset(f,0,sizeof(f));
            f[0][0]=1;
            for (int i=1;i<=n;i++)
                for (int j=1;j<=m;j++)
                    if (i>=j)
                        f[i][j]=f[i-1][j-1]+f[i-j][j];
            printf("%d\n",f[n][m]);
        }
    }
    
  • -1
    @ 2017-06-25 16:45:40
    #include<iostream>
    using namespace std;
    long long n,k,ans;
    void dfs(int t,int s,int b)
    {
        int i;
        //if(n==200&&k==6)
        //ans=4132096;
        else
        {
        if(s==n&&t==k){
            ans++;
            return;
        }
        if(s==n||t==k) return;
        for(i=b;i<=n-s;i++)
        if(s+i<=n) dfs(t+1,s+i,i);
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>n>>k;
        dfs(0,0,1);
        cout<<ans;
        return 0;
    }
    
  • -1
    @ 2017-04-28 16:54:04

    #include<stdio.h>
    #include<string.h>
    #define fijk f[n][k][x]
    int f[300][10][300];
    int dijk(int n,int k,int x){
    if(k==1) return fijk=1;
    else if(~fijk) return fijk; fijk=0;
    for(int i=x;i<=n/k;++i) fijk+=dijk(n-i,k-1,i);
    return fijk;
    }
    int main(){
    int n,k; scanf("%d%d",&n,&k);
    memset(f,-1,sizeof f);
    printf("%d\n",dijk(n,k,1));
    }

  • -1
    @ 2016-11-17 20:06:04

    #include<iostream>
    using namespace std;
    int fenjie(int n,int k,int a){
    if(k==1){
    return 1;
    }
    int m=0;
    int q=n/k;
    for(int i=a;i<=q;i++){
    m+=fenjie(n-i,k-1,i);
    }
    return m;
    }
    int main(){
    int n,k;
    cin>>n>>k;
    cout<<fenjie(n,k,1);
    return 0;
    }

  • -1
    @ 2016-10-23 20:46:50
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    int n,k,ans=0;
    int main()
    {
        cin>>n>>k;
        if(k==2)
        {
            cout<<n/2<<endl;
        }
        if(k==3)
        {
            int a,b,c;
            for(int a=1;a<=n/3;a++)
                for(int b=a;b<=(n-a)/2;b++)
                    for(int c=n-a-b;c>=b;c--)
                    {
                        if(a+b+c==n)
                        ans++;
                    }
            cout<<ans<<endl;
        }
        if(k==4)
        {
            int a,b,c,d;
            for(int a=1;a<=n/4;a++)
                for(int b=a;b<=(n-a)/3;b++)
                    for(int c=b;c<=(n-a-b)/2;c++)
                        for(int d=n-a-b-c;d>=c;d--)
                        {
                            if(a+b+c+d==n)
                            ans++;
                        }
            cout<<ans<<endl;
        }
        if(k==5)
        {
            int a,b,c,d,e;
            for(int a=1;a<=n/5;a++)
                for(int b=a;b<=(n-a)/4;b++)
                    for(int c=b;c<=(n-a-b)/3;c++)
                        for(int d=c;d<=(n-a-b-c)/2;d++)
                            for(int e=n-a-b-c-d;e>=d;e--)
                            {
                                if(a+b+c+d+e==n)
                                ans++;
                            }
            cout<<ans<<endl;
        }
            if(k==6)
        {
            int a,b,c,d,e,f;
            for(int a=1;a<=n/6;a++)
                for(int b=a;b<=(n-a)/5;b++)
                    for(int c=b;c<=(n-a-b)/4;c++)
                        for(int d=c;d<=(n-a-b-c)/3;d++)
                            for(int e=d;e<=(n-a-b-c-d)/2;e++)
                                for(int f=n-a-b-c-d-e;f>=e;f--)
                                {
                                    if(a+b+c+d+e+f==n)
                                    ans++;
                                }
            cout<<ans<<endl;
        }
        return 0;
    }
    
  • -1
    @ 2016-10-23 20:46:32
    int main
    
  • -1
    @ 2016-10-23 20:46:14

    好啊

信息

ID
1117
难度
3
分类
动态规划 点击显示
标签
递交数
6168
已通过
3140
通过率
51%
被复制
14
上传者