ダイナミック プログラミング: ナルトのシャドウ クローン

NARUTOの世界では、敵に対して予測できないことが非常に重要です。

主人公のうずまきナルトが持つ技、多重影分身術はその好例です。

シャドウクローンはナルトの体のチャクラエネルギーによって作成され、チャクラが使用されるほど、作成されるシャドウクローンはより強力になります。

さまざまな戦闘状況に応じて、ナルトはさまざまな強さの影のクローンを作成することを選択できます。一部はフェイント攻撃に使用され、一部は致命的な打撃に使用されます。

ここで疑問が生じます。ナルトのチャクラ エネルギーがMで、彼のシャドウ クローンの数が最大Nであると仮定すると、シャドウ クローンを作成する際の分散方法は何通りありますか?

:

  1. シャドウ クローンが配布できるエネルギーは 0 です。

  1. 割り当てスキームでは順序は考慮されません。たとえば、M=7、N=3 の場合、(2,2,3) と (2,3,2) は同じスキームとみなされます。

入力フォーマット

1行目はテストデータの番号tです。

次の各行には、スペースで区切られた 2 つの整数MNが含まれています。

出力フォーマット

入力データMおよびNの各セットについて、割り当てられたメソッドの数を出力するために 1 行を使用します。

データ範囲

0≤t≤20

1≤M、N≤10

入力サンプル:

1
7 3

出力例:

8

アイデア: i は選択された数値の合計を表し、j は選択された数値の数を表します。dp[i][j] は、合計が i であり、j 個の数値の合計に分割されるスキームを表します。

#include<iostream>
using namespace std;
#define N 11
int dp[N][N];
int main()
{
    int t;
    dp[0][0] = 1;//初始状态是1,即不选任何数也是一种方案
    cin >> t;
    while (t--)
    {
        int m, n;
        cin >> m >> n;
        for (int i = 0; i <= m; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                dp[i][j] = dp[i][j - 1];
                if (i >= j) dp[i][j] = dp[i][j - 1] + dp[i - j][j];
            }
        }
        cout << dp[m][n] << endl;
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/m0_73648729/article/details/129247822