首页 > 其他分享 >k维背包

k维背包

时间:2023-10-07 11:25:48浏览次数:27  
标签:背包 pw min int i5 i1 dp

题目链接:E - Product Development (atcoder.jp)

因为最多为5,因此可以暴力枚举

int dp[10][10][10][10][10];
int a[110][10];
int n, k, p;
signed main()
{
    for (int i1 = 0; i1 <= 5; i1++)
        for (int i2 = 0; i2 <= 5; i2++)
            for (int i3 = 0; i3 <= 5; i3++)
                for (int i4 = 0; i4 <= 5; i4++)
                    for (int i5 = 0; i5 <= 5; i5++)
                        dp[i1][i2][i3][i4][i5] = 1145141919810;
    dp[0][0][0][0][0] = 0;
    cin >> n >> k >> p;
    for (int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        for (int j = 1; j <= k; j++)
        {
            cin >> a[i][j];
        }
        for (int j = k + 1; j <= 5; j++)
        {
            a[i][j] = p;
        }
        for (int i1 = p; i1 >=0 ; i1--)
            for (int i2 = p; i2 >=0 ; i2--)
                for (int i3 = p; i3 >=0 ; i3--)
                    for (int i4 = p; i4 >=0 ; i4--)
                        for (int i5 = p; i5 >=0 ; i5--)
                        {
                            dp[min(p, i1 + a[i][1])][min(p, i2 + a[i][2])][min(p, i3 + a[i][3])][min(p, i4 + a[i][4])][min(p, i5 + a[i][5])] = min(dp[min(p, i1 + a[i][1])][min(p, i2 + a[i][2])][min(p, i3 + a[i][3])][min(p, i4 + a[i][4])][min(p, i5 + a[i][5])], dp[i1][i2][i3][i4][i5] + x);
                        }
    }
    if (dp[p][p][p][p][p] == 1145141919810)
        cout << -1;
    else
        cout << dp[p][p][p][p][p];
}

也可以使用动态规划。没太看懂应该是状态压缩吧(jiangly)的代码

int main()
{
    IOS;
    int n, k, p; cin >> n >> k >> p;
    vector<int> pw(k + 1);
    pw[0] = 1;
    for(int i = 1; i <= k; i ++)
        pw[i] = pw[i - 1] * (p + 1);
    vector<ll> dp(pw[k], -1ll);
    dp[0] = 0;
    for(int i = 0; i < n; i ++)
    {
        int c; cin >> c;
        vector<int> a(k);
        for(int j = 0; j < k; j ++) cin >> a[j];
        for(int s = pw[k] - 1; s >= 0; s --)
        {
            int t = 0; 
            for(int j = 0; j < k; j ++)
            {
                int aa = s / pw[j] % (p + 1);
                int na = min(p, aa + a[j]);
                t += na * pw[j];
            }
            if(dp[s] != -1 && (dp[t] == -1 || dp[t] > dp[s] + c))
            {
                dp[t] = dp[s] + c;
            }
        }
    }
    cout << dp.back() << endl;
    return 0;
}

 

标签:背包,pw,min,int,i5,i1,dp
From: https://www.cnblogs.com/ZouYua/p/17745841.html

相关文章

  • 背包DP
    题目背景:你有一个容量为M的背包,有N个物品,每个物品的重量和价值分别为w[i]和c[i],现在选一些物品放入这个背包使装入的价值最大1.01背包(每件物品只有1件):倒序枚举重量,O(N^2) E(i,n){ cin>>w>>c; for(intj=m;j>=w;--j)f[j]=max(f[j],f[j-w]+c); }2.完全背包(每件物品......
  • P9140 [THUPC 2023 初赛] 背包
    prologue这很难评(调了我1h,我都想紫砂了。还是典型得不重构就看不见系列。analysis如果我们还是一个正常人,那么我们大体上是能看到题目的加粗字,这个格式很明显符合我们的同余最短路的格式。(如若不知,请先出门直走)然后我们就要考虑这个同余最短路的实现。这个题目不同于往常......
  • 算法之动态规划(DP)求解完全背包问题(状态转移式方程推导)
    完全背包是01背包的进阶版。在这里补充一下代码随想录的完全背包状态转移式的推导。有兴趣的可以先看一看原版。状态转移方程状态:dp[i][j]选择前i个物品,容量为j的背包时所选物品价值总和最大。状态转移:dp[i][j]=max(dp[i-1][j-k*v[i]]+k*w[i])(k=0,1,2,3...)(j-k*v......
  • 子树合并背包类型的 dp 的复杂度证明
    首先,我们发现,转移一颗子树的背包,实际上就是把该子树的根节点的所有儿子的子树背包合并,再与根节点合并。具体的,合并两颗子树的转移方程式如下:\[f(u,i)=\max\limits_{j+k=i}\{f(v_1,j)+f(v_2,k)\}\]于是有如下伪代码:dfs(u): su=1 f(u,1)=w[u] for(vinu) sv=siz......
  • DP背包-完全背包
    背包问题-完全背包例题题目描述此题和原题的不同点:\(1\).每种草药可以无限制地疯狂采摘。\(2\).药的种类眼花缭乱,采药时间好长好长啊!师傅等得菊花都谢了!输入格式输入第一行有两个整数,分别代表总共能够用来采药的时间\(t\)和代表山洞里的草药的数目\(m\)。第\(2\)到......
  • DP背包-01背包
    背包问题-01背包首先我们要明白什么是01背包,在下述例题中,由于每个物体只有两种可能的状态(取与不取),对应二进制中的\(0\)和\(1\),这类问题便被称为\(\text{「0-1背包问题」}\)。题目描述有\(N\)件物品和一个容量为\(M\)的背包。第\(i\)件物品的重量是\(W_i\),价值是\(D......
  • 多重背包单调队列优化
    引用自:动态规划-背包问题(01背包、完全背包、多重背包)#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;constintmaxn=100005;intn,m,cnt;intv[102],num[102],dp[maxn];structQueue{intpos,val;}q[maxn];intmain(){......
  • 遗传算法解决01背包问题
    遗传算法解决01背包问题一、问题描述01背包问题是组合优化问题的一个典型例子,它要求在许多可行解中找到一个最优解。01背包问题的一般描述如下:给定一个固定的背包容量和一组物品,每个物品有一个重量和一个价值,要求从这组物品中选择一些放入背包,使得背包中物品的总价值最大,同时不......
  • 01背包问题
     一个大佬的写法:#include<bits/stdc++.h>usingnamespacestd;constintMAXN=1005;intv[MAXN];//体积intw[MAXN];//价值intf[MAXN][MAXN];//f[i][j],j体积下前i个物品的最大价值intmain(){intn,m;cin>>n>>m;for(in......
  • 背包问题(0-1&&完全背包 )
    https://programmercarl.com/背包理论基础01背包-1.html#总结https://www.bilibili.com/video/BV1C7411K79w?p=1&vd_source=46d50b5d646b50dcb2a208d3946b1598packagedynamic;publicclassBeibao{publicstaticvoidmain(String[]args){int[]weight={1......