P2386 放苹果(排列组合问题)
目录
DP
DFS
题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法)
输入输出格式
输入格式:
第一行是测试数据的数目t(0 <= t <= 20),以下每行均包括二个整数M和N,以空格分开。1<=M,N<=10
输出格式:
对输入的每组数据M和N,用一行输出相应的K。
输入输出样例
输入样例#1: 复制
1
7 3
输出样例#1: 复制
8
输入样例#2: 复制
3
3 2
4 3
2 7
输出样例#2: 复制
2
4
2
这题和数的划分做法相近,可以用DFS和DP,但是要注意该题的盘子是可空的。
DP
F[ i ][ j ]表示将 i 份分在 j 个盘子里
F[ 0 ][ j ]=F[ 1 ][ i ]=1 当苹果数量为0或1时只有一种方法
F[ i ][ 1 ]=1 当只有一个盘子时只有一种方法
- 当 i<j 时,也就是苹果数量小于盘子数量时,F[ i ][ j ]=F[ i ][ i ] 因为 i 个苹果最多只能占用 i 个盘子
- 当i>=j时,F[ i ][ j ]=F[ i-j ][ j ] + F[ i ][ j-1 ]
F[ i ][ j-1 ] 表示j个盘子中有空盘,取出空盘
F[ i-j ][ j ] 则是每个盘子先放一个苹果的策略
代码:
#include<bits/stdc++.h>
using namespace std;
int f[15][15];//f[i][j]即为i个苹果放在j个盘子里的方案数
int m,n,ans;
int main()
{ios::sync_with_stdio(false);int t;cin >> t;while(t--){cin >> m >> n;ans=0;memset(f,0,sizeof(f));//清空f数组 for(int i=1;i<=n;i++)f[0][i]=f[1][i]=1;for(int i=1;i<=m;i++)f[i][1]=1;]for(int i=2;i<=m;i++)for(int j=2;j<=n;j++)if(i<j)//如果苹果比盘子还少 f[i][j]=f[i][i];//等于i个苹果放在i个盘子里 elsef[i][j]=f[i-j][j]+f[i][j-1];//对于每一次,有两种做法: //1:j个盘子里都放 1个,即 f[i-j][j]//2:都不放,即 f[i][j-1]cout << f[m][n] << endl;//输出 }return 0;
}
DFS
#include<iostream>
using namespace std;
int t,n,k;
int f[11][11];
int sum;void dfs(int step,int num,int tar)
{if(tar==1){sum++; return ;}for(int i=step;i<=num/tar;i++)dfs(i,num-i,tar-1);
}int main()
{ios::sync_with_stdio(false);cin>>t;while(t--){cin>>n>>k;sum=0;dfs(0,n,k);//因为可以有空盘,所以从0开始 cout<<sum<<endl;}return 0;
}
P2386 放苹果(排列组合问题)相关推荐
- P2386 放苹果 方法一
http://noi.openjudge.cn/ch0203/666/ /* 2.3基本算法之递归变递推_666放苹果 方法一 http://noi.openjudge.cn/ch0203/666/1 ...
- 5个球放入3个箱子_排列组合问题,把5个相同的球放到三个相同的盒子里,要求每个盒子都有球,则不同的放球方法是多少?...
一个一个的列出来就好了. 2种.311和221 ----............... 修改. 这本来就是从一个一个列举出来的.要用到排列组合的都是一些特定的情况.不过这道题貌似用不上. 比如5个球变 ...
- 排列组合与盒子放球问题
文章目录 排列组合 定义 组合公式 1.证明 C n m = C n n − m C_n^m=C_n^{n-m} Cnm=Cnn−m 2.证明 C n m C m k = C n k C n − ...
- 排列组合 n个球放入m个盒子问题 总结
算法: HDU - 6397 Character Encoding 插板法+容斥原理 https://blog.csdn.net/xiang_6/article/details/81868989 [ ...
- POJ 1164 放苹果 经典的组合问题
Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 ...
- 排列组合 n个球放入m个盒子算法 总结
问题: 总结 https://blog.csdn.net/qwb492859377/article/details/50654627 N个球放M个盒子问题 https://blog.csdn. ...
- 【放苹果】m个苹果放到n个盘子中
m个相同的苹果,放在n个相同的盘子中,由于相同,使用排列组合的方法不好处理.这里选用递归调用的方式解决问题: (8个苹果,放在3个盘子里)= (8个苹果,放在2个盘子) +(5个苹果,放在2个盘子[每 ...
- 组合数学(排列组合,容斥原理,数论定理)
组合数学的学习 排列组合 一.排列组合基础 二.排列组合练习题 容斥原理 定理学习 例题练习 例题1: [ 1 , n ] [1,n] [1,n] 中有多少个数能被 x 或 y 整除 例题2: [ 1 ...
- c语言 10分苹果,POJ1664 放苹果 递归 C语言
Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 ...
最新文章
- atomikos mysql,记一次 Atomikos 分布式事务的使用
- Java IO: 字节和字符数组
- 【华为大咖分享】10.DevOps敏捷测试之道(后附PPT下载地址)
- C语言 extern
- mysql 联合主键_Mysql 创建联合主键
- Eclipse简单字体设置
- 最优化方法笔记-线性规划(大M法与两阶段法)
- 数据结构(四)图 —— 编程作业 04 :哈利·波特的考试
- chart metadata is missing these dependencies
- 什么是和包(NFC)业务
- #1778. [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元)
- cpu.h-栈的宏定义-满减栈
- php float 取整,php float 转 int 的问题
- 安全运维和安全运营的区别
- [Delphi]Delphi中的ODBC和ADO
- 看一遍你也会做!用英伟达 DIGITS 进行图像分割(下)
- 排序-------简单选择实现(Java实现)
- WordPress php升级到7.2提示Warning: Use of undefined constant Y – assumed ‘Y’ 问题解决
- 32位程序在64位系统上调用GetModuleFileNameEx失败
- 基于JAVA宠物爱心救助系统计算机毕业设计源码+系统+lw文档+部署