当前位置: 首页 > news >正文

[题解]2025HDU春季联合(五) - 小凯逛超市

  • Souces:1001 - 小凯逛超市
  • Abstract:有 n n n 种物品和一个容积为 m m m 的背包,每种物品有无限多个,对于第 i i i 种物品,其价格为 g i g_i gi ,体积 v i ≡ 1 v_i\equiv 1 vi1。求在花费不超过 V V V 的情况下,恰好填满背包的方案数。答案对 1 0 9 + 7 10^9+7 109+7 取模。
  • Limition:多测, 1 ≤ T ≤ 5 , 1 ≤ n , m , V , g i ≤ 400 1\le T\le 5,1\le n,m,V,g_i\le 400 1T5,1n,m,V,gi400
  • Keyword:DP(签到题)
  • Solution:完全背包求填满方案数板子题。下面以闫氏DP分析法对DP状态进行分析:
    • 状态表示:定义状态 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k] ,用于表示考虑前 i i i 个物品,背包容量恰好为 j j j ,且花费恰好为 k k k 的方案数,属性为“Sum”。由于空背包也算作一种方案,故 d p [ 0 ] [ 0 ] [ 0 ] = 1 dp[0][0][0]=1 dp[0][0][0]=1
    • 状态计算:对于 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]
      • 不可选 i i i 种物品:若背包容积不够( j ≤ 0 j\le 0 j0 )或物品价格大于当前花费( g [ i ] > k g[i]>k g[i]>k )时,第 i i i 种物品不可选,此时直接转移自第 i − 1 i-1 i1 个物品的状态;
      • 可选第 i i i 种物品:若 j > 0 j>0 j>0 k ≥ g i k\ge g_i kgi ,则可选第 i i i 种物品,此时又分 2 2 2 种情形:
        • 选第 i i i 种物品:花费 1 1 1 个体积购买物品 i i i,由于为完全背包问题,同一物品可购买多次,状态转移自第 i i i 种物品。
        • 不选第 i i i 种物品:若已达到约束要求,则第 i i i 种物品没必要选,则直接转移自第 i − 1 i-1 i1 个物品的状态
    • 因此对于 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k] ,其满足要求的状态有选 i i i 和没必要选 i i i 两种,累加这两种情况。最后遍历所有 ≤ V \le V V的情形累加即可。
  • Equation: d p [ i ] [ j ] [ k ] + = { d p [ i − 1 ] [ j ] [ k ] , 不选 i ( 包含不可选与不必要选 ) d p [ i ] [ j − 1 ] [ k − g [ i ] ] , 选 i \begin{equation}dp[i][j][k]+=\begin{cases}dp[i-1][j][k],& 不选i(包含不可选与不必要选)\\dp[i][j-1][k-g[i]],& 选i\end{cases}\end{equation} dp[i][j][k]+={dp[i1][j][k],dp[i][j1][kg[i]],不选i(包含不可选与不必要选)i
  • Tip:本题内存限制262144 K,以三维数组刚好以261304 K极限通过。建议采用滚动数组方式压维。
  • Code:
    #include<bits/stdc++.h>
    using namespace std;
    const int MOD = 1e9 + 7;
    
    void solve() {
        int n, m, V;
        cin >> n >> m >> V;
        vector<int> g(n+1);
        for (int i = 1; i <= n; i++) cin >> g[i];
        vector<vector<vector<int>>> dp(n+1, vector<vector<int>>(m+1, vector<int>(V+1, 0)));
        dp[0][0][0] = 1;
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= m; j++) {
                for (int k = 0; k <= V; k++) {
                    dp[i][j][k] = (dp[i][j][k] + dp[i-1][j][k]) % MOD;//注意求方案数问题是累加
                    if (j > 0 && k >= g[i]) {
                        dp[i][j][k] = (dp[i][j][k] + dp[i][j-1][k-g[i]]) % MOD;
                    }
                }
            }
        }
        int ans = 0;
        for (int i = 0; i <= V; i++) {
            ans = (ans + dp[n][m][i]) % MOD;
        }
        cout << ans << endl;
    }
    
    int main() {
        ios::sync_with_stdio(0);
        int t;
        cin >> t;
        while (t--) {
            solve();
        }
        return 0;
    }
    

相关文章:

  • 可不可以自己做网站网络营销策划方案模板
  • 阿里云做企业网站成都市seo网站公司
  • 绍兴公司网站建设 中企动力绍兴关键词优化哪家强
  • 网页版qq注册做灰色词seo靠谱
  • 企业门户网站需求模板百度网址大全网址导航
  • 网站新增一个域名备案武汉搜索推广
  • JAX、Flax 和 PyTorch 之间的类比关系
  • 【doris】在线事务处理
  • Chapter07_图像压缩编码
  • 苍穹外卖Day2
  • 文件操作(C语言)
  • 蓝桥云客---蓝桥速算
  • 网络安全L2TP实验
  • 对状态模式的理解
  • 14.2linux中platform无设备树情况下驱动LED灯(详细编写程序)_csdn
  • kubeadm部署 Kubernetes(k8s) 高可用集群 V1.28.2
  • 日志统计(双指针)
  • Chrome开发者工具实战:调试三剑客
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第六讲)
  • 新版pycharm如何实现debug调试需要参数的python文件
  • 【CSS】样式与效果
  • C语言之编译和debug工具
  • C++模板递归结构详解和使用
  • React中类组件的生命周期
  • 【51单片机】2-8【I/O口】数码管显示矩阵按键值
  • python通过调用海康SDK打开工业相机(全流程)