zoukankan      html  css  js  c++  java
  • AtCoder Beginner Contest 054 D 完全背包

    D - Mixing Experiment

    题意:要合成一种化工物品C,需要特定比率ma:mb的物品A和物品B。现给出n种包,每种包中含有ai克物品A和bi克物品B,且这个包费用ci。问是否能合成物品C,如能合成求最少费用。

    tags:一眼能看出是背包,但就是做不出来。。

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define FF(i,a,b) for (int i=a;i<=b;i++)
    #define F(i,b,a)  for (int i=b;i>=a;i--)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    typedef long long ll;
    const int N = 50, M = 20;
    
    int n, ma, mb, a[N], b[N], c[N], dp[N+1][N*M+1][N*M+1], ans;
    //dp[i][ai][bi]表示选完1~i种包后,取了ai克A和bi克B的花费
    int main()
    {
        cin>>n>>ma>>mb;
        FF(i,1,n) cin>>a[i]>>b[i]>>c[i];
        mes(dp, INF);  dp[1][0][0]=0;
        FF(i,1,n) FF(ca,0,N*M) FF(cb,0,N*M) {
            if(dp[i][ca][cb]==INF) continue;
            dp[i+1][ca][cb]=min(dp[i+1][ca][cb], dp[i][ca][cb]);
            dp[i+1][ca+a[i]][cb+b[i]]=min(dp[i+1][ca+a[i]][cb+b[i]], dp[i][ca][cb]+c[i]);
        }
        ans=INF;
        FF(i,1,N*M) FF(j,1,N*M) if(i*mb==j*ma)
            ans=min(ans, dp[n+1][i][j]);
        if(ans==INF) cout<<-1<<endl;
        else cout<<ans<<endl;
    
        return 0;
    }
  • 相关阅读:
    ABP框架理论学习之Debugging
    探索博客园的“打赏”模式
    P3382 【模板】三分法
    1020.数字识别
    洛谷 P1162 填涂颜色
    在windows命令行批量ping局域网内IP
    1154:LETTERS
    百炼 2790:迷宫
    洛谷 P1605 迷宫
    2012年NOIP普及组 摆花
  • 原文地址:https://www.cnblogs.com/sbfhy/p/6390298.html
Copyright © 2011-2022 走看看