zoukankan      html  css  js  c++  java
  • 复杂整数的划分问题(dp,背包)

    描述

    将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 k>=1
    正整数n 的这种表示称为正整数n 的划分。

    输入
    标准的输入包含若干组测试数据。每组测试数据是一行输入数据,包括两个整数N 和 K。
    (0 < N <= 50, 0 < K <= N)
    输出
    对于每组测试数据,输出以下三行数据:
    第一行: N划分成K个正整数之和的划分数目
    第二行: N划分成若干个不同正整数之和的划分数目
    第三行: N划分成若干个奇正整数之和的划分数目
    样例输入
    5 2
    样例输出
    2
    3
    3
    提示
    第一行: 4+1, 3+2,
    第二行: 5,4+1,3+2
    第三行: 5,1+1+3, 1+1+1+1+1+1
     1 #include<iostream>
     2 #include<string.h>
     3 using namespace std;
     4 int dp1[51][51], dp2[51][51], dp3[51][51];
     5 int n,k;
     6 int main()
     7 {
     8     int i,j;
     9     while(cin>>n>>k)
    10     {
    11         memset(dp1,0,sizeof(dp1));
    12         memset(dp2,0,sizeof(dp2));
    13         memset(dp3,0,sizeof(dp3));
    14         //Q1,将n划分为k个正整数
    15         dp1[0][0]=1;
    16         for (i=1;i<=n;i++)//
    17             for (j=1;j<=i;j++)//划分为j个数,注意边界条件!!
    18                 dp1[i][j]=dp1[i-j][j]+dp1[i-1][j-1]; //dp1[i-j][j]意思是把i-j划分为j个不同的数,然后每个数+1
    19         cout<<dp1[n][k]<<endl;
    20         //Q2,把n划分为若干不同的正整数的个数(背包)
    21         //用1-j的数凑i,d[i][j], d[i-j][j-1]选取j,而且不能重复,则用1 - j-1凑i-j,
    22         //d[i][j-1] j不选,则用1 - j-1 凑i 
    23         dp2[0][0]=1;
    24         for (i=1;i<=n;i++)//
    25             for (j=1;j<=n;j++)//划分的数字在1~j范围内
    26             {
    27                 if (j==i)
    28                     dp2[i][j]=dp2[i][j-1]+1;
    29                 else if (j>i)
    30                     dp2[i][j]=dp2[i][i];
    31                 else
    32                     dp2[i][j]=dp2[i-j][j-1]+dp2[i][j-1];//唯一的不同,dp2[i-j][j-1]
    33             }
    34         cout<<dp2[n][n]<<endl;
    35         //Q3:n划分成若干个奇正整数之和的划分数目
    36         dp3[0][0]=1;
    37         for (i=1;i<=n;i++)
    38             for (j=1;j<=n;j++)//划分的数字在1~j范围内
    39             {
    40                 if (j%2==0)//假如是偶数则往下递推(偶数不选) 
    41                     dp3[i][j]=dp3[i][j-1];
    42                 else if (i<j)//是奇数则计算方法同简单的整数划分
    43                     dp3[i][j]=dp3[i][i];
    44                 else if (i==j)
    45                     dp3[i][j]=dp3[i][j-1]+1;
    46                 else
    47                     dp3[i][j]=dp3[i-j][j]+dp3[i][j-1];
    48             }
    49         cout<<dp3[n][n]<<endl;
    50     }
    51     return 0;
    52 }
  • 相关阅读:
    httprunner 3.x--参数化parameters(参数和值多对一,多对多,一对一等),csv文件
    httprunner 3.x--variables变量和声明(变量和值一一对应)
    httprunner 3.x 带参数接口测试(get方法)
    appium安装(windows7)
    httprunner 3运行报错AttributeError: module 'allure' has no attribute 'severity_level'
    jmespath用法
    httprunner3.x 测试用例应用/变量传递(测试用例编写)
    Python框架之Tornado(一)
    Python之Web框架
    Python 装饰器(进阶篇)
  • 原文地址:https://www.cnblogs.com/mr-wei977955490/p/15367593.html
Copyright © 2011-2022 走看看