Codecorces 1076 😀E. Product Queries

Codecorces 1076 😀
E. Product Queries

给你一个数组,让你使用该数组里面尽可能少的数,凑出1 - n 。(可以重复使用数组中的数字)

第一眼以为是个数学题,需要因式分解之类的,想了一会发现搞不出来,遂看题解, 发现应该使用 DP

定义以下状态:DP[i] 表示凑出 i 所需要的最少数字.

注意到可以重复使用,枚举每个不同的数字在 1-n 里面能扩展到哪些数字,经典的不同数字 nlogn 暴力枚举(调和级数枚举)

#include<bits/stdc++.h>

using namespace std;

const int N = 3e5+10;

int dp[N];

 

void solve(){

int n;cin>>n;

set<int>s;

for(int i=1;i<=n;i++){

int x;cin>>x;

s.insert(x);

}

memset(dp,0x3f,sizeof dp);

dp[0] = 0;

for(auto x:s){

dp[x] = 1;

for(int i = 2;i*x <= n;i++){

dp[i*x] = min(dp[i*x],dp[i]+dp[x]);

}

}

for(int i=1;i<=n;i++){

if(dp[i]==0x3f3f3f3f)cout<<-1<<" ";

else cout<<dp[i]<<" ";

}

cout<<"\n";

}

signed main(){

int T;

cin>>T;

// T = 1;

while(T--)solve();

return 0;

}
posted @ 2026-01-29 22:37  爱吃鱼的小丑猫  阅读(2)  评论(0)    收藏  举报