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;
}

 

posted @ 2017-02-11 23:47  v9fly  阅读(268)  评论(0编辑  收藏  举报