zoukankan      html  css  js  c++  java
  • BZOJ4145_The Prices_KEY

    题目传送门

    看到M<=16经典状态压缩的数据范围,考虑题目。

    一道类似于背包的题目。

    设f[i][j]表示前i个商店,物品购买状态为j。

    先将f[i][j]加上w[i](到i的路费),转移一次,在与同状态的前一商店取min就好了。

    code:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
     
    int N,M,a[105][20],w[105];
    int f[105][1<<16];
     
    int main()
    {
        scanf("%d%d",&N,&M);
            for(int i=1;i<=N;i++){
                scanf("%d",&w[i]);
                for(int j=1;j<=M;j++)scanf("%d",&a[i][j]);
            }
            for(int S=1;S<1<<M;S++)f[0][S]=1e9;
            for(int i=1;i<=N;i++){
                for(int S=0;S<1<<M;S++)f[i][S]=f[i-1][S]+w[i];
                for(int S=0;S<1<<M;S++)
                    for(int j=1;j<=M;j++)
                        if(!(S&(1<<j-1)))f[i][S|(1<<j-1)]=min(f[i][S|(1<<j-1)],f[i][S]+a[i][j]);
                for(int S=0;S<1<<M;S++)f[i][S]=min(f[i][S],f[i-1][S]);
            }
        printf("%d",f[N][(1<<M)-1]);
        return 0;
    }
  • 相关阅读:
    团队项目-选题报告
    图论3-分层图最短路
    图论2-次短路计数
    图论1-k短路
    noi online 提高组t2冒泡排序
    图和树
    搜索(bfs)
    搜索(dfs)
    笔记
    打工
  • 原文地址:https://www.cnblogs.com/Cptraser/p/8715779.html
Copyright © 2011-2022 走看看