dp题
由于每一个都是上一个的倍数 显然可以证明 如果可以用一个较大的 肯定用了是更优的
那么我们就可以进行刷表dp
就是 n/1 + n/2 +n/3 +...+n/n 调和级数掉
最后mnlgm (m值域)
轻轻松松松【雾
//Love and Freedom.#include#include #include #include #define ll long long#define inf 20021225#define N 100000using namespace std;int f[N+10];int a[51];int main(){ int n,sum = 0,ans=inf; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum+=a[i]; memset(f,48,sizeof(f)); f[1] = sum; for(int i=1;i<=N;i++) for(int j=2;j*i<=N;j++) { int tmp = 0; for(int k=1;k<=n;k++) tmp += a[k]/(j*i); //if(tmp) printf("%d %d\n",tmp,i*j); f[j*i] = min(f[j*i],f[i]-(j-1)*tmp); ans = min(ans,f[i*j]); } printf("%d\n",ans); return 0;}