国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

1103. Integer Factorization (30)

2019-11-08 19:44:37
字體:
來源:轉載
供稿:網友

1.題面

https://www.patest.cn/contests/pat-a-PRactise/1103

2.題意

將一個數字分解成若干正整數冪之和,比如

169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2如果存在多種分解,要求輸出正整數之和最小的,如果還有多解要求輸出字典序最小的

3.思路

貌似暴力搜索加剪枝也可以得到答案,但是搜索保存答案似乎更快,十幾毫秒就過了

4.代碼

/*****************************************************************    > File Name: cpp_acm.cpp    > Author: Uncle_Sugar    > Mail: uncle_sugar@QQ.com    > Created Time: Thu 16 Feb 2017 02:21:19 CST*****************************************************************/# include <cstring># include <iostream># include <iomanip># include <vector>using namespace std;const int size  = 10 + 1000 ; int n, k, p;vector<int>  vct;int vis[size][size];int fa_vis[size][size];int sum[size][size];int iniv[size];int ipow(int n, int k){    int ret = 1;    for (; k; k>>=1, n *= n){        if (k&1) ret *= n;    }    return ret;}int getAns(int _n, int _k){    if (vis[_n][_k] != -1) return vis[_n][_k];    int ret = 0;    for (int k = vct.size()-1; k >= 0; k--){        int i = vct[k];        if (_n - i >= 0 && getAns(_n - i, _k - 1)){            if (ret == 0){                fa_vis[_n][_k] = _n-i;                sum[_n][_k] = sum[_n-i][_k-1] + iniv[i];                ret = 1;            }else if (sum[_n][_k] < sum[_n-i][_k-1] + iniv[i]){                fa_vis[_n][_k] = _n-i;                sum[_n][_k] = sum[_n-i][_k-1] + iniv[i];            }        }    }    return vis[_n][_k] = ret;}int main(){    std::ios::sync_with_stdio(false);cin.tie(0);    memset(vis, -1, sizeof(vis));    fa_vis[0][0] = -1;    cin >> n >> k >> p;    for (int i = 1; i <= n; i++){        int t = ipow(i, p);        iniv[t] = i;        if (t > n) break;        vct.push_back(t);    }    for (int i = 0; i <= n; i++) vis[i][0] = 0;    vis[0][0] = 1;    if (getAns(n, k)){        cout << n;        char flag = 1;        while (fa_vis[n][k] != -1){            int t = fa_vis[n][k];            if (flag) cout << " =", flag = 0;            else cout << " +";            cout << " " << iniv[n-t] << "^" << p;            n = fa_vis[n][k]; --k;        }        cout << endl;    }else {        cout << "Impossible" << endl;    }    return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天津市| 高尔夫| 陇南市| 澄迈县| 深水埗区| 焦作市| 津南区| 旌德县| 唐海县| 神农架林区| 布尔津县| 如东县| 抚宁县| 西宁市| 讷河市| 子长县| 三原县| 凉城县| 阜平县| 油尖旺区| 太谷县| 邯郸县| 浮山县| 横峰县| 子长县| 康马县| 武川县| 海盐县| 郑州市| 佳木斯市| 新密市| 和龙市| 横山县| 英德市| 两当县| 嘉善县| 湖口县| 泸水县| 兴业县| 铅山县| 扎赉特旗|