首页 > 其他分享 >糖果

糖果

时间:2024-02-03 14:34:50浏览次数:32  
标签:方程 包含 int 个数 糖果 转移 dp

引言

题目链接:https://www.acwing.com/problem/content/description/1049/

思路

状态表示:
dp[i][j]:表示从前 i 个数中组成总和 %k 等于 j 的方案数。

状态转移:
可以根据是否选择第 i 个数来进行划分:

  1. 包含第 i 个数:dp[i - 1][((j - w[i]) % k + k) % k] + w[i]

  2. 不包含第 i 个数:dp[i - 1][j]

转移方程证明:

首先不包含第 i 个数的转移方程比较容易看出,不包含 i 的方案数和从前 i-1 个数中组成总和 %k 等于 j 的方案数相同。

包含第 i 个数的转移方程,可以设前 i-1 个数的和为 S,其中有 (S + w[i]) % k = j,那么 S = nk + j - w[i],则 S % k = (j - w[i]) % k。

注意: j - w[i] 可能为负数,所以要 + k

代码

#include <bits/stdc++.h>
#define N 1000

int n,k;
int w[N];
int dp[N][N];

int main() {
    std::cin >> n >> k;
    for (int i = 1 ; i <= n ; i ++ ) std::cin >> w[i];
    
    memset(dp,-0x3f,sizeof dp);
    
    dp[0][0] = 0;
    for (int i = 1 ; i <= n ; i ++ ) {
        for (int j = 0 ; j <= k - 1 ; j ++ ) {
            dp[i][j] = std::max(dp[i-1][j],dp[i-1][((j - w[i]) % k + k) % k] + w[i]);
        }
    }
    
    std::cout << dp[n][0] << '\n';
    
    return 0;
}

标签:方程,包含,int,个数,糖果,转移,dp
From: https://www.cnblogs.com/NachoNeko/p/18004753

相关文章

  • 洛谷 P8687 [蓝桥杯 2019 省 A] 糖果
    题意有\(m\)种口味,每次\(k\)颗一袋出售,给你\(n\)包均为\(k\)颗的糖果,求最少买几袋可以吃到所有口味的糖果。思路暴力对\(n\)包糖果做组合。如果找到其中一种包含了所有口味,将所有满足的方案取糖果包数最小即可。时间复杂度\(\mathcal{O(2^n)}\)。正解考虑状......
  • 代码随想录 day34 K 次取反后最大化的数组和 加油站 分发糖果
    K次取反后最大化的数组和按照元素的绝对值大小进行排序把绝对值大的且小于0的取反如果还能取反那么奇数次的话就把绝对值小的取反偶数次不用管加油站首先如果总油量小于总消耗是一定不能跑完的这里的思路是如果[0,i]区间不能油量小于消耗那么就尝试从下一个i+1......
  • 2023四川大学“腾讯杯”新生赛(同步赛)糖果(鸽巢原理)
    这个数据范围,\(n是1e6,a_i也是1e6\),任意\(a_i+a_j\in[0,2e6]\),所以如果有答案我们最多枚举\(2e6\)个数就可以找到答案voidsolve(){intn;cin>>n;vector<int>a(n);map<int,int>mp;for(inti=0;i<n;i++)cin>>a[i];......
  • 飞盘队/糖果
    SFZOJ1008老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的N头奶牛中选出一支队伍。每只奶牛的能力为整数,第i头奶牛的能力为Ri。飞盘队的队员数量不能少于1、大于N。一支队伍的总能力就是所有队员能力的总和。约翰比较迷信,他的幸运数字是F,所以他要求队伍的总能力必......
  • 【算法基础】贪心算法 LeetCode 135. 分发糖果
    分发糖果题目介绍n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。测试用......
  • 代码随想训练营第三十四天(Python)| 1005.K次取反后最大化的数组和、134. 加油站、135.
    1005.K次取反后最大化的数组和classSolution:deflargestSumAfterKNegations(self,nums:List[int],k:int)->int:nums.sort(key=lambdax:abs(x),reverse=True)foriinrange(len(nums)):ifnums[i]<0andk>0:......
  • 分糖果
    题目:小明从糖果盒中随意抓一把糖果;每次小明会取出一半的糖果分给同学们。当糖果不能平均分配时;小明可以选择从糖果盒中,假设盒中糖果足够;取出一个糖果或放回一个糖果。小明最少需要多少次;取出、放回和平均分配均记一次;能将手中糖果分至只剩一颗。输入15,输出5,过程:(1)15+1=16(2......
  • Luogu P8518 [IOI2021] 分糖果
    题目链接 做这道题本意是为了补CCPC秦皇岛热身赛C,也就是2022CCPC华为云计算挑战赛 机器人那题先考虑一个盒子怎么做,并且不考虑限制那样的话可以得到时刻和盒子内球的数量的图像,考虑由这个不加限制的图像推出加上限制的实际答案完整的图像一定是极大值极小值交错,考虑两个相......
  • Steam糖果派对新作《鼠托邦》BBGAMES建设老鼠王国的战略模拟电子游戏
    游戏《鼠托邦Ratopia》由独.立游戏开发团队CasselGames精心打造,将在11月6日起BBIN游戏抢先体验测试。在这款游戏中,您将化身为糖果派对游戏中的老鼠女王,领您的老鼠民众建设城市、勘探地.下领域以扩展生存空间。同时,您有机会根据不同老鼠市民的性格和技能,智慧地分配工作,依靠整......
  • 分发糖果
    题目n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到1个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并返回需要准备的最少糖果数目示例1:输入:ratings=......