题意:每个水果有美味值a和能量值b,当美味值之和是能量值之和的k倍时,求最大的美味值之和。
解:它长得像背包题,但是没有背包体积。它的限制是sum a = k * sum b ,移项得 sum a - k * sum b = 0 ,将b换成a-k*b,然后当正常背包做。限制很奇怪的背包问题应该都可以这么做,前提是式子为线性的。
代码:

#include <bits/stdc++.h> using namespace std; #define ll long long #define maxx 105 #define eps 0.00000001 #define inf 0x7fffffff #define mod 998244353 //#define int long long int n,k; int a[maxx],b[maxx]; int dp[maxx][5000]={0}; signed main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); for(int i=1;i<=n;i++) b[i]=a[i]-k*b[i]; for(int i=0;i<=n;i++) for(int j=0;j<5000;j++) dp[i][j]=-inf; dp[0][2000]=0; for(int i=1;i<=n;i++){ for(int j=-1000;j<=1000;j++) dp[i][j+2000]=max(dp[i-1][j+2000],dp[i-1][j-b[i]+2000]+a[i]); } if(dp[n][2000]==0) printf("-1\n"); else printf("%d\n",dp[n][2000]); return 0; } //make a the value and b the weight //sum of value should be k times of sum of weight //a=kb //make weight a-kb belongs to [-1000,100], add 1100 to them all.
标签:
DP on CF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?