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;
}

浙公网安备 33010602011771号