放苹果 动态规划 dp

在这里插入图片描述
**

解题思路:

**
首先用dp[j][i]来表示有j个苹果放在i个盘子里。
j<i:意思就是盘子多了,例如2个苹果放在7个盘子里,和2个苹果放在2个盘子里方法数是一样的(本题是这样滴。。。)。所以:dp[j][i]=dp[j][j];
j==i:例如3个苹果放3个盘子里,等于3个苹果放3个盘子的方法数(就是1),加上3个苹果放2个盘子的方法数。所以:dp[j][i]=1+dp[j][i-1];
j>i:例如题干的7个苹果放3个盘子里,先算把盘子都放满的方法数(只包括7个苹果放3个盘子(每个盘子都至少先放一个苹果),放好后就剩下4个苹果,方法数就等于4个苹果放入3个盘子的总方法数(可以有盘子为空)),然后加上上一次的方法数[就是加上7个苹果放2个盘子的总方法数(可以有盘子为空,即包括7个苹果放2个盘子和7个苹果放1个盘子)]。所以:dp[j][i]=dp[j][i-1]+dp[j-i][i];
print最开始的for嵌套是先给赋初值,比如把上面的7个苹果放1个盘子的方法数
赋值为1。。。。。

#include<stdio.h>

int dp[15][15],t,m,n;

void print(){
    for(int j=0;j<=m;j++){
    	for(int i=0;i<=n;i++){
            if(j==0||j==1)
				dp[j][i]=1;
            if(i==1||i==0)
                dp[j][i]=1;
    	}
    }
    for(int j=2;j<=m;j++){
    	for(int i=2;i<=n;i++){
       	 	if(i>j)
            	dp[j][i]=dp[j][j];
        	if(i<j)
            	dp[j][i]=dp[j][i-1]+dp[j-i][i];
            if(i==j)
                dp[j][i]=1+dp[j][i-1];
    	}
    }
    printf("%d\n",dp[m][n]);
}

int main(){
    scanf("%d",&t);
    for(int i=0;i<t;i++){
        scanf("%d %d",&m,&n);
    	print();
    }
    return 0;
}

有帮助就点个赞啵,来手赞赏也是非常妙的
在这里插入图片描述

发布了13 篇原创文章 · 获赞 13 · 访问量 329

猜你喜欢

转载自blog.csdn.net/qq_43320728/article/details/104488579