zoukankan      html  css  js  c++  java
  • hihocoder-1486物品价值(状压dp)

    题目链接:

    物品价值

    小Hi现在有n个物品,每个物品都有一个价值。并且这n个物品总共有m个不同的属性,每个物品都具有其中若干属性。

    小Ho要从中选出若干物品,满足每个属性都正好有奇数个物品拥有,且被选出的物品价值总和最大。你能帮助小Ho完成任务么?

    Input

    第一行一个数T(<=10),表示数据组数。对于每一组数据:

    第一行两个数n,m(1<=n<=1000,m<=10)

    接下来每两行描述一件物品。对于每一件物品:

    第一行两个数v和s,表示其价值和所含属性数量(v<=100000,s<=m)

    第二行s个数,表示该物品拥有的属性编号(1<=编号<=m)

    Output

    物品价值总和的最大值。

    Sample Input

    1
    3 2
    2 1
    1
    2 1
    2
    5 2
    1 2
    

    Sample Output

    5

    题意:

    思路:m<=10,所以可以用二进制表示奇数个还是偶数个,然后就可以转移了

    代码:
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    int n,m,v[1010],a[1010];
    int dp[1010][1026];
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)
            {
                int w,x,tep=0;
                scanf("%d%d",&v[i],&w);
                for(int j=1;j<=w;j++)
                {
                    scanf("%d",&x);
                    x--;
                    tep+=(1<<x);
                }
                a[i]=tep;
            }
            memset(dp,-1,sizeof(dp));
            dp[0][0]=0;
            for(int i=1;i<=n;i++)
            {
                for(int j=0;j<(1<<m);j++)dp[i][j]=dp[i-1][j];
                for(int j=0;j<(1<<m);j++)
                {
                    if(dp[i-1][j]>=0)dp[i][j^a[i]]=max(dp[i][j^a[i]],dp[i-1][j]+v[i]);
                }
            }
            cout<<dp[n][(1<<m)-1]<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    B站使用总结
    安装国外浏览器的好处
    查看网页源代码
    如何下载bilibili上面的视频
    11.27
    11.26
    11.25
    11.24获取时间
    11.23
    11.21
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/6681237.html
Copyright © 2011-2022 走看看