关于方案背包dp(动态规划)(openjudge:8467鸣人的影分身, 666放苹果)

时间:2021-04-22
本文章向大家介绍关于方案背包dp(动态规划)(openjudge:8467鸣人的影分身, 666放苹果),主要包括关于方案背包dp(动态规划)(openjudge:8467鸣人的影分身, 666放苹果)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

最基本的类型:给出n个存储位(或者给出大小为n的存储量),给出m个存储物,求将m个存储物全部放进n个存储位中有多少种放置的方法(即求方案数sum)

注意:

对于部分题目,会给出存储物的数量以及大小

如果没有给出,比如例题一,那么就可以直接把存储物总量(0 ~ m)每一个都当作存储物,一次放入存储位中

基本的动态转移方程:dp[i][j] += dp[i - 1][j - q]

例题

(1)openjudge----8467----鸣人的影分身

在火影忍者的世界里,令敌人捉摸不透是非常关键的。我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。

影分身是由鸣人身体的查克拉能量制造的,使用的查克拉越多,制造出的影分身越强。

针对不同的作战情况,鸣人可以选择制造出各种强度的影分身,有的用来佯攻,有的用来发起致命一击。

那么问题来了,假设鸣人的查克拉能量为M,他影分身的个数为N,那么制造影分身时有多少种(用K表示)不同的分配方法?(影分身可以被分配到0点查克拉能量)

分析:

翻译题意:给出n个存储位,给出m个存储量,求将m个存储量全部放进n个存储位中有多少种放置的方法(就是最基本的方案背包)

核心代码段:

        int dp[15][15] = {};
        dp[0][0] = 1;
        for(int q = 0;q <= m;q++)//枚举存储量的种类(每个分身的查克拉量
{
for(int i = 1;i <= n;i++)//第i个分身 { for(int j = q;j <= m;j++)//前i个分身共用掉了多少查克拉量 { dp[i][j] += dp[i - 1][j - q];//方案求和 } } }

例题持续补充中~

原文地址:https://www.cnblogs.com/mint-hexagram/p/14691417.html