题目大意:类似于一种完全背包,给你n,a,b,c,n是背包容量,a,b,c是物品重量,物品价值为1。要用a,b,c填满n,求最大的a,b,c的总个数。换句话说就是公式x*a+y*b+z*c=n,求x+y+z的最大值。
#include<bits/stdc++.h> #define inf 100009 using namespace std; const int maxn=1e6+7; int w[4]; int m; int a,b,c; int f[maxn]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>m>>a>>b>>c; w[1]=a; w[2]=b; w[3]=c; memset(f,inf,sizeof(f));//把f数组填成负无穷,可以完成把背包填满的操作 //原因是当f为负无穷时,非物品重量组合或其倍数是无法转移过来的。 f[0]=0; for(int i=1;i<=3;i++){ for(int j=w[i];j<=m;j++){ f[j]=max(f[j],f[j-w[i]]+1); } } cout<<f[m]<<"\n"; return 0; }
A. Cut Ribbon——cf119
最新推荐文章于 2024-07-22 19:45:19 发布