666:放苹果

总时间限制: 
1000ms    
内存限制: 
65536kB
描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
1
7 3
样例输出
8

分析:

放苹果,仔细看,恩递推,再仔细看,好像没有固定的套路.但是又想想好像好几种套路都可以解决掉.所以这里讲几种方法

P1:记忆化DP方式:

我们考虑,我们用i个苹果放在j个盘子里有几种方式呢.

1,我们可以空一个盘子,之后i个苹果,放在j个盘子里

2,我们可以将每个盘子里都放1个苹果,接下来的i-j个苹果可以放在j个盘子里.

而这个思路,其实状态转移方程就是可以写出来了.

这里会有点小问题可能需要解释一下.

1,可能会想到,为什么我们不能在一个状态里空好几个盘子呢..每次都考虑过放盘子.而转移到当前状态的时候.是考虑过前面空盘子的状态.所以这里就考虑一个位置的情况就行了.
2,初始化的问题.这里我们想到.如果我们就没有盘子,但是有很多苹果,其实就一种情况.反过来如果就一个苹果但是有很多盘子,这里也就只有一种情况.所以这里边界其实就显而易见就出来了.

#include<cstdio>
#include<algorithm>
using namespace std;
int dp[15][15];
int f(int i,int j)
{
if(i<0)return 0;
if(i==1||i==0||j==1||j==0)return 1;
dp[i][j]=f(i,j-1)+f(i-j,j);
return dp[i][j];
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
int ans=f(n,m);
printf("%d\n",ans);
}
return 0;
}

2,背包DP解法

这种解法其实正确来讲用i来表示到底有多少个盘子是空的.而每次如果是空的.那就相当与在j-1个盘子里放k-i个苹果.这里的每一种状态的方案数是其他方案综合起来的.所以这个会简单一点.

所以这里最好是根据代码来理解每一个状态之间的转移.

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
void f(int m, int n) {
int i, j, k;
int dp[11][11] = {0};
dp[0][0] = 1;
for(i = 0; i <= m; i++)
for(j = 1; j <= n; j++)
for(k = i; k <= m; k++)
dp[j][k]+= dp[j-1][k-i];
cout << dp[n][m] << endl;
}
int main()
{
int n,m,t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&m,&n);
f(m,n);
}
return 0;
}

OpenJudge 666:放苹果 // 瞎基本DP的更多相关文章

  1. 666:放苹果(划分dp)

    666:放苹果 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示 ...

  2. OpenJudge 666:放苹果

    总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输 ...

  3. POJ1664:放苹果(线性dp)

    题目: http://poj.org/problem?id=1664 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1 ...

  4. noi 666 放苹果

    题目链接:http://noi.openjudge.cn/ch0206/666/ 和ural 1114题意类似,但是有顺序,5,1,1和1,5,1是同一种序列.不能直接枚举 d(i,j) 前 i 个盘 ...

  5. 刷题向》DP》放苹果 (normal)

    这篇博客可能字数比较多,而且很难讲清楚,我会努力给你们讲清楚: 首先,放苹果是一道DP,之所以难,是因为很难想到,我的确有同学用三维数组做出来,然而三维的的确比二维好理解,但三维复杂度太高,虽然DP一 ...

  6. openjudge666:放苹果—题解

    (测试这里的markdown,同时也有纪念意义吧--第一次写的题解) 当时刚学递推的时候做的一道题 oj上的666题 666:放苹果 总时间限制: 1000ms 内存限制: 65536kB 描述 把M ...

  7. 递归--练习4--noi666放苹果

    递归--练习4--noi666放苹果 一.心得 写出状态后勇敢假设 二.题目 666:放苹果 总时间限制:  1000ms 内存限制:  65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允 ...

  8. 放苹果问题 DP计数 m个苹果放在n个盘子里,苹果,盘子相同,盘子可为空

    详细的解释放苹果问题的链接:苹果可相同可不同,盘子可相同可不同,盘子可空和不可空,都有详细的说明··· http://www.cnblogs.com/celia01/archive/2012/02/1 ...

  9. [DP题]放苹果

    放苹果(DP做法) 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法.输入第一行是测试数据的数目t(0 < ...

随机推荐

  1. 【Bugly干货分享】一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言 好吧,说是“粒子引擎”还是大言不 ...

  2. Aspectj 实现Method条件运行

    最近我花了半个小时实现了一个Method的按自定义条件运行的plugin,Condition-Run.实现场景是由于我所工作的客户经常会是在同一个代码集上实现多个Brand,所以有些功能只会限制是几个 ...

  3. [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门

    [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习 ...

  4. [ACM_动态规划] 数字三角形(数塔)

    递归方法解决数塔问题 状态转移方程:d[i][j]=a[i][j]+max{d[i+1][j],d[i+1][j+1]} 注意:1\d[i][j]表示从i,j出发的最大总和;2\变界值设为0;3\递归 ...

  5. knh

    市场调研,分析—— 决定是否创业 不要再极度的沉默无言.宅.无存在感,无趣,难熬..

  6. Redis操作命令总结

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/118.html?1455860089 一.key pattern 查询相应 ...

  7. Atitit 泛型原理与理解attilax总结

    Atitit 泛型原理与理解attilax总结 1. 泛型历史11.1.1. 由来11.2. 为什么需要泛型,类型安全21.3. 7.泛型的好处22. 泛型的机制编辑22.1.1. 机制32.1.2. ...

  8. Storm 实战:构建大数据实时计算

    Storm 实战:构建大数据实时计算(阿里巴巴集团技术丛书,大数据丛书.大型互联网公司大数据实时处理干货分享!来自淘宝一线技术团队的丰富实践,快速掌握Storm技术精髓!) 阿里巴巴集团数据平台事业部 ...

  9. Java删除数据库中的数据

    1:删除数据库中数据表中的数据同样也是一个非常用的技术,使用executeUpdate()方法执行用来做删除SQL的语句可以删除数据库表中的数据 2:本案例使用Statement接口中的execute ...

  10. 日志框架只打印出Mybatis SQL的配置

    项目比较大,各种乱七八糟的框架.Log4j配置的是INFO级别. 然而今天开发的时候我需要log4j打印出SQL的执行情况. 先改log4j的rootLogger级别到DEBUG......后果就是各 ...