试题分析
我们发现若是要选馒头的话则应该从馒头售价高的先装。
并且若要选择包装盒时应该选择装x个最小的时候。所以只需要贪心$+$背包即可。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; inline int read(){ int f=1,ans=0;char c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){ans=ans*10+c-‘0‘;c=getchar();} return f*ans; } const int MAXN=10001; int val[MAXN<<2],w[MAXN<<2],c[MAXN<<2],s[MAXN<<2],dp[MAXN<<2],n,m; bool cmp(int x1,int x2){return x1>x2;} int main(){ memset(dp,127/3,sizeof(dp)); n=read(),m=read(); for(int i=1;i<=n;i++) val[i]=read();sort(val+1,val+n+1,cmp); for(int i=1;i<=n;i++) s[i]=s[i-1]+val[i]; for(int i=1;i<=m;i++) w[i]=min(read(),n),c[i]=read();dp[0]=0; for(int i=1;i<=m;i++){ for(int j=2*n;j>=w[i];j--) dp[j]=min(dp[j],dp[j-w[i]]+c[i]); } for(int i=2*n-1;i>=0;i--) dp[i]=min(dp[i],dp[i+1]); int maxn=0; for(int i=1;i<=n;i++) maxn=max(maxn,s[i]-dp[i]); cout<<maxn; }
原文地址:https://www.cnblogs.com/si-rui-yang/p/10159320.html
时间: 2024-11-10 04:19:06