优化代码#include<bits/stdc++.h> using ll=long long; const int maxn=1e3+1e2; const int inf=1e3; int step[maxn]; void init(){ std::queue<int>q; step[0]=1; q.push(1); while(!q.empty()){ int y=q.front();q.pop(); for(int x=1;x<=y;x++){ int ny=y+(y/x); if(step[ny]||ny>inf){ continue; } step[ny]=step[y]+1; q.push(ny); } } } void solve() { int n,k;std::cin>>n>>k; std::vector<int>b(n),c(n); for(auto&i:b)std::cin>>i; for(auto&i:c)std::cin>>i; std::vector<int> dp(maxn*maxn); for(int i=0;i<n;i++){ for(int j=k;j>=step[b[i]];j--){ dp[j]=std::max(dp[j],dp[j-step[b[i]]]+c[i]); } } std::cout<<dp[k]<<'\n'; } int main() { init(); std::cin.tie(nullptr)->sync_with_stdio(false); int t;std::cin>>t; while(t--)solve(); return 0; }
时间: 2024-04-25 09:25:46 浏览: 141
C++代码优化方案.
这段代码实现了一个背包问题的解决方法,其中使用了一个预处理函数 `init()` 来计算每个数在最多进行多少次加法操作后会超过阈值 `inf`,然后使用动态规划来求解背包问题。具体来说,对于每个物品,将其体积视作加法操作的起点 `b[i]`,价值视作该加法操作所需的代价 `c[i]`,然后使用动态规划求解在限制条件为 `k` 的情况下,能够获得的最大价值。
在实现上,使用一个一维数组 `dp` 来存储当前状态下的最优解。对于每个物品 `i`,从 `k` 到 `step[b[i]]` 的范围内,依次更新 `dp[j]` 的值,使其等于 `dp[j-step[b[i]]]+c[i]` 和 `dp[j]` 之间的较大值。最终,`dp[k]` 的值即为所求的最大价值。
需要注意的是,在代码实现中没有对输入数据进行验证,可能存在输入数据不符合要求的情况。此外,代码中使用了 `using ll=long long;` 来定义了一个别名 `ll`,但并没有使用到该别名。建议将其删除,以免造成不必要的困惑。
阅读全文