hihocoder #1486 : 物品价值

dp[i][j]  到第i个物品 状态为 j 的二进制串 能得到的最大价值

#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<map>
#include<queue>
#include<set>
#include<vector>
using namespace std;

#define inf  1000000007
#define ll long long
#define MAXN  1010

int dp[MAXN][(1<<10)+10];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int ed=1<<m;
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=ed;j++)
                dp[i][j]=-inf;
        }
        dp[0][0]=0;
        int d=ed-1;
        for(int i=1;i<=n;i++)
        {
            int w,k;
            scanf("%d%d",&w,&k);
            int a=0;
            for(int j=1;j<=k;j++)
            {
                int b;
                scanf("%d",&b);
                b--;
                a=a+(1<<b);
            }
            for(int j=0;j<=d;j++)
            {
                dp[i][j^a]=max(dp[i-1][j]+w,dp[i][j^a]);
                dp[i][j]=max(dp[i-1][j],dp[i][j]);
            }
        }
        int mx=0;
        mx=max(mx,dp[n][d]);
        cout<<mx<<endl;
    }
    return 0;
}

#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<map>
#include<queue>
#include<set>
#include<vector>
using namespace std;

#define inf  1000000007
#define ll long long
#define MAXN  1010

int dp[MAXN][(1<<10)+10];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int ed=1<<m;
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=ed;j++)
                dp[i][j]=-inf;
        }
        dp[0][0]=0;
        int d=ed-1;
        for(int i=1;i<=n;i++)
        {
            int w,k;
            scanf("%d%d",&w,&k);
            int a=0;
            for(int j=1;j<=k;j++)
            {
                int b;
                scanf("%d",&b);
                b--;
                a=a+(1<<b);
            }
            for(int j=0;j<=d;j++)
            {
                dp[i][j^a]=max(dp[i-1][j]+w,dp[i][j^a]);
                dp[i][j^a]=max(dp[i-1][j^a],dp[i][j^a]);
            }
        }
        int mx=0;
        mx=max(mx,dp[n][d]);
        cout<<mx<<endl;
    }
    return
时间: 2024-11-13 00:20:12

hihocoder #1486 : 物品价值的相关文章

[Offer收割]编程练习赛11 题目2 : 物品价值

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi现在有n个物品,每个物品都有一个价值.并且这n个物品总共有m个不同的属性,每个物品都具有其中若干属性. 小Ho要从中选出若干物品,满足每个属性都正好有奇数个物品拥有,且被选出的物品价值总和最大.你能帮助小Ho完成任务么? 输入 第一行一个数T(<=10),表示数据组数.对于每一组数据: 第一行两个数n,m(1<=n<=1000,m<=10) 接下来每两行描述一件物品.对于每一件物品: 第一行两个数v

hihocoder-1486物品价值(状压dp)

题目链接: 物品价值 小Hi现在有n个物品,每个物品都有一个价值.并且这n个物品总共有m个不同的属性,每个物品都具有其中若干属性. 小Ho要从中选出若干物品,满足每个属性都正好有奇数个物品拥有,且被选出的物品价值总和最大.你能帮助小Ho完成任务么? Input 第一行一个数T(<=10),表示数据组数.对于每一组数据: 第一行两个数n,m(1<=n<=1000,m<=10) 接下来每两行描述一件物品.对于每一件物品: 第一行两个数v和s,表示其价值和所含属性数量(v<=100

hihocoder offer收割编程练习赛11 B 物品价值

思路: 状态压缩 + dp. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int INF = 0x3f3f3f3f; 8 9 int t, n, m, s; 10 int V[1005], S[1005], dp[1005][(1 << 11) +

编程练习赛11B 物品价值(装压dp)

题意:每个物品有m(m<=10)种属性和一个价格,你有n种物品从中任意选择一些物品,让每种属性恰好有奇数个物品拥有,输出满足条件的最大价值和 题解:一看就是明显的01背包问题,但是价格乘以个数的平方太大了,所有无法直接枚举价格进行背包 首先可以发现只分成奇数与偶数.而且m很小,所以可以对于每个物品的属性使用二进制压缩,此位有这个属性就变成1,否则为0 然后因为同奇同偶相加为偶.否则为奇,类似异或的规则,所以两个物品和在一起就是用两个压缩数进行异或 最后可以发现虽然不能枚举价格,但是压缩后的数只能

NYOJ 820 又见01背包 (价值和重量互换)

链接:click here 题意: 描述     有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 的物品,求所有挑选方案中物品价值总和的最大值. 1 <= n <=100 1 <= wi <= 10^7 1 <= vi <= 100 1 <= W <= 10^9 输入 多组测试数据. 每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的wi 和 vi. 输出 满足题意的最大价值,每组测试数据占

01背包与物品无限背包

一.01背包问题 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为C1,C2,…,Cn,与之相对应的价值为W1,W2,…,Wn.求解将那些物品装入背包可使总价值最大. 动态规划: 1) 子问题定义:F[i][j]表示前i件物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值. 2) 根据第i件物品放或不放进行决策 其中F[i-1][j]表示前i-1件物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值: 而F[i-1][j-C[i]]+W[i]表示前i-1

【转】 背包问题——“完全背包”详解及实现(包含背包具体物品的求解)

完全背包是在N种物品中选取若干件(同一种物品可多次选取)放在空间为V的背包里,每种物品的体积为C1,C2,…,Cn,与之相对应的价值为W1,W2,…,Wn.求解怎么装物品可使背包里物品总价值最大. 动态规划(DP): 1) 子问题定义:F[i][j]表示前i种物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值. 2) 根据第i种物品放多少件进行决策      (备注:应该还有一项f[i-1][j])        (2-1) 其中F[i-1][j-K*C[i]]+K*W[i]表示前i

【转】背包问题——“01背包”详解及实现(包含背包中具体物品的求解)

01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为C1,C2,…,Cn,与之相对应的价值为W1,W2,…,Wn.求解将那些物品装入背包可使总价值最大. 动态规划(DP): 1) 子问题定义:F[i][j]表示前i件物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值. 2) 根据第i件物品放或不放进行决策                         (1-1) 其中F[i-1][j]表示前i-1件物品中选取若干件物品放入剩余空间为j的背包中所能得到的最大价值: 而

区块链开发公司 区块链的主链价值在哪里?

区块链开发公司的主链是区块链所有应用的底层技术基础,就像芯片与操作系统,谁能成为区块链基础层的主链,积累海量的用户以及场景,谁就有可能成为未来的苹果.微软等巨头.随着技术不断发展,生产交换效率得到相应提高.如互联网能更好解决信息传播问题,而难以保证物品价值不会在信息传递过程中受到损害.区块链网络则能较好地解决这一痛点.同时,区块链是一种共享的分布式数据库技术.区块链技术采用先进的加密技术,保证账本中任何新增信息都不可篡改,除非符合某些预设的参数.而且这种账本对外界的防御能力更强,比如网络语言××