日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[UVa1213]Sum of Different Primes(递推,01背包)

發(fā)布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [UVa1213]Sum of Different Primes(递推,01背包) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3654

題意:把n拆成k個不同素數(shù)的和,有多少種拆法。

dp(i,j)表示數(shù)字為i時,有j個不同素數(shù)和的組合數(shù)。

先枚舉素數(shù)的上界k,注意是不同素數(shù),那就再在k個素數(shù)中做01背包,dp(i,j)+=dp(i-p,j-1)統(tǒng)計出現(xiàn)次數(shù)就行了。

1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef long long LL; 5 const int maxn = 1320; 6 bool isprime[maxn]; 7 int prime[maxn]; 8 int pcnt; 9 int n, k; 10 LL dp[maxn][maxn]; 11 12 void init() { 13 memset(isprime, true, sizeof(isprime)); 14 memset(prime, 0, sizeof(prime)); 15 pcnt = 0; 16 } 17 void getPrime() { 18 init(); 19 prime[0] = prime[1] = 0; 20 for(int i = 2; i <= maxn; i++) { 21 if(isprime[i]) prime[++pcnt] = i; 22 for(int j = 1; j <= pcnt; j++) { 23 if(i * prime[j] > maxn) break; 24 isprime[i*prime[j]] = 0; 25 if(i % prime[j] == 0) break; 26 } 27 } 28 } 29 30 int main() { 31 // freopen("in", "r", stdin); 32 // freopen("out", "w", stdout); 33 getPrime(); 34 memset(dp, 0, sizeof(dp)); 35 dp[0][0] = 1; 36 for(int k = 0; k < pcnt; k++) { 37 for(int i = 1120; i >= 0; i--) { 38 int bound = lower_bound(prime, prime+k, i) - prime + 1; 39 for(int j = 1; j < bound; j++) { 40 int& p = prime[k]; 41 if(p > i) break; 42 dp[i][j] += dp[i-p][j-1]; 43 } 44 } 45 } 46 while(~scanf("%d%d",&n,&k) && n+k) { 47 printf("%lld\n", dp[n][k]); 48 } 49 return 0; 50 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/kirai/p/6096865.html

總結(jié)

以上是生活随笔為你收集整理的[UVa1213]Sum of Different Primes(递推,01背包)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。