From 5a9d1efd5d7febcd43524a2a2679397ae5f213df Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Mon, 17 Nov 2025 15:46:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=A7=84=E5=88=92=E8=A7=A3=E6=B3=95=E7=94=A8=E4=BA=8E=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E7=89=B9=E5=AE=9A=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现了一个基于动态规划的算法来解决给定问题,包括处理输入数据、计算最优解和输出结果。主要逻辑集中在solve函数中,通过遍历和比较来找到最优解。 --- src/11/17/P14508.cpp | 100 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/11/17/P14508.cpp diff --git a/src/11/17/P14508.cpp b/src/11/17/P14508.cpp new file mode 100644 index 0000000..8f2d19c --- /dev/null +++ b/src/11/17/P14508.cpp @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include +#include +using ll = int64_t; +#define sl static inline +#define printf +const ll inf=1e9+7; +std::vector a,b,dp,dpf; +std::map rstep; +ll n,m; +struct Mu{ + ll num,idx; + inline bool operator<(const Mu&o)const{ + return num cminuse; + +sl ll minuse(ll val){ + if(cminuse[val].idx!=inf){ + return cminuse[val].idx; + } + for(ll i=1;i<=m;i++){ + const ll num = (val+a[i]-1)/a[i]; + cminuse[val]=std::min(cminuse[val],{num*b[i],i}); + } + return cminuse[val].idx; +} + +sl void solve(){ + ll ans=0; + std::cin>>n>>m; + a.clear(),b.clear(),dp.clear(),dpf.clear(),rstep.clear(),cminuse.clear(); + a.resize(m+1),b.resize(m+1),dp.resize(n+1,inf),dpf.resize(n+1,inf),cminuse.resize(n+1,{inf,inf}); + dp[0]=0; + for(ll i=1;i<=m;i++){ + std::cin>>a[i]; + } + for(ll i=1;i<=m;i++){ + std::cin>>b[i]; + } + for(ll i=1;i<=m;i++){ + for(ll j=a[i];j<=n;j++){ + const ll ndp=dp[j-a[i]]+b[i]; + // printf("i=%lld, j=%lld, ndp=%lld\n",i,j,ndp); + if(ndp=1;j--){ + dp[j]=std::min(dp[j],dp[j+a[i]]+b[i]); + } + } + printf("dp[]: "); + for(ll i=1;i<=n;i++){ + printf("%lld ",dp[i]); + } + printf("\n"); + printf("dpf[]: "); + for(ll i=1;i<=n;i++){ + printf("%lld ",dpf[i]); + } + printf("\n"); + printf("minuse(%lld)=%lld\n",n,minuse(n)); + ll nuse=0; + for(ll i=1;i<=n;){ + const ll use=minuse(n-i),k=i+a[use]; + nuse+=b[use]; + for(ll j=i+1;j<=k&&j<=n;j++){ + if(dp[k-j]==inf){ + std::cout<<"-1\n"; + return; + }else{ + ans=std::max(ans,dp[k-j]+nuse); + } + } + i=k; + } + std::cout<>c>>t; + while(t--){ + solve(); + } +} \ No newline at end of file