Codeforces Beta Round #82 (Div. 2) C. Buns(多重揹包)

題目鏈接
在這裏插入圖片描述
題意:麪包師Lavrenty打算用餡料做幾個麪包,然後把它們賣掉。Lavrenty有n克麪糰和m種不同的餡料。餡料種類的下標從1到m,他知道他的第i種餡料剩下ai 克,做一個第i種餡料的麪包,恰恰需要bi克的i種餡料和ci克的麪糰,同時這種麪包可以賣di塊錢。他也可以做沒有餡的麪包。每個這樣的麪包需要c0克麪糰,可以賣d0塊Tugrik。所以Lavrenty可以做任何數量的包子,用不同的餡料或者不用餡料,除非用完了麪糰和餡料。Lavrenty會扔掉烘培麪包後剩下的所有多餘材料。
求出Lavrenty可以賺取的錢的最大數量。
思路:把餡料看成商品,單獨做麪包的也看成一個商品,n克麪粉就是揹包容量,剩下的就是多重揹包模板題了,
dp【i】【j】代表i中餡料j克麪包的最大價值。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int n,m,dp[12][maxn],a[12],b[12],c[12],d[12],ans=0;
int main()
{
	scanf("%d %d %d %d",&n,&m,&c[1],&d[1]);
	for(int i=2;i<=m+1;++i) scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]);
	a[1]=b[1]=0;
	for(int i=1;i<=m+1;++i) 
	{
		for(int j=0;j<=n;++j)
		for(int k=0;k*b[i]<=a[i]&&k*c[i]<=n;++k)
		if(j>=k*c[i]) dp[i][j]=max(dp[i][j],dp[i-1][j-k*c[i]]+d[i]*k);
	}
	for(int i=1;i<=m+1;++i) for(int j=0;j<=n;++j) ans=max(ans,dp[i][j]);
	printf("%d\n",ans);
 } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章