AtCoder Beginner Contest 054 D 完全背包
题意:要合成一种化工物品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; }