《演算法筆記上機實驗指南》第4章 入門篇(2)8.1
A1103:
/*
南牆:
1.所選擇的數的p次方之和==n+選擇底數個數剛好為n
2.如果有最大的底數之和則更新
3.然後返回空
分支:
1.不用訪問0那個數
2.選擇加入:價將底數index加入到臨時陣列vector中,然後DFS,index就是當前加入到臨時陣列temp中的那個數,同時總的 選的數字個數要改變 選擇的數的p次方之和要改變 總的和也要改變
3.選擇不加入:將剛才那個放入陣列中的數,彈出,然後訪問下一個,剩下的引數不變
初始化陣列fac:
1.void 型別
2.變數 i=0 temp=0
3.while迴圈條件:temp<=n,將temp放入到陣列中,然後改變temp的值
index訪問的數字就是按照從0開始,進行升序排列的
其實本道題和例子中那個,就多了一個要訪問最優序列
如果最後的底數之和沒有發生任何改變的,就表示麼有任何合適的序列,則輸出-1
*/
#include<iostream>
#include<vector>
using namespace std;
vector<int> fac,temp,ans;
int n,p,k,maxnbottom=-1;
int power(int x) //計算x的p次方
{
int ans=1;
//等會來看這個問題
while(p!=0)
{
ans*=x;
p--;
}
/*for(int i=0; i<p; i++)
ans*=x;*/
return ans;
}
void init()
{
int temp=0,i=0;
//for(int temp=0; temp<=n; temp=power(i++))
while(temp<=n)
{
fac.push_back(temp); //將temp放入到陣列vector中其實就是按照0,1,2,3,4,5....的順序進行放入的
temp=power(++i);
}
}
void DFS(int index, int Nown, int sum, int num) //4個引數分別表示:當前訪問的指數,當前訪問的底數個數,當前訪問的p次方的個數之和,底數之和
{
if(sum==n && Nown==k)
{
if(num>maxnbottom)
{
maxnbottom=num;
ans=temp;
}
return ;
}
if(sum>n || Nown>k)
return ;
if(index-1>=0)
{
temp.push_back(index);
DFS(index,Nown+1,sum+fac[index],num+index);
temp.pop_back();
DFS(index-1,Nown,sum,num);
}
}
int main()
{
cin >> n >> k >> p;
init();
DFS(fac.size()-1,0,0,0);
if(maxnbottom==-1)
cout << "Impossible" << endl;
else
{
printf("%d = %d^%d",n,ans[0],p);
for(int i=1; i<ans.size(); i++)
{
printf(" + %d^%d",ans[i],p);
}
}
return 0;
}
這裡有個小問題:
//在使用下面這個程式中,對於power函式而言,使用while和for不一樣,使用while會導致記憶體不夠,而使用for可以,因為while迴圈結束後不回從記憶體中釋放掉空間,但是for迴圈結束後是會從空間中釋放掉記憶體。所以我總結的是,在init的函式中,不管是使用while還是for都不影響,唯一合理的解釋是,在init中呼叫,power函式,是需要開闢空間的,而power函式中使用while是不會釋放空間,所以導致記憶體不夠,如果使用for迴圈,在power函式迴圈結束時,會釋放掉空間,所以不會超過記憶體
#include<iostream>
#include<vector>
using namespace std;
vector<int> fac,temp,ans;
int n,p,k,maxnbottom=-1;
int power(int x) //計算x的p次方
{
int ans=1;
while(p!=0)
{
ans*=x;
p--;
}
/*for(int i=0; i<p; i++)
ans*=x;*/
return ans;
}
void init()
{
int temp=0,i=0;
while(temp<=n)
{
fac.push_back(temp); //將temp放入到陣列vector中其實就是按照0,1,2,3,4,5....的順序進行放入的
temp=power(++i);
}
}
int main()
{
cin >> n >> k >> p;
init();
return 0;
}
相關文章
- 《深度學習入門》第 2 章 感知機 筆記深度學習筆記
- 《Redis入門指南(第2版)》摘要Redis
- React入門指南(學習筆記)React筆記
- Go 入門指南學習筆記Go筆記
- pandas 學習筆記 (入門篇)筆記
- 《GitHub 入門與實踐》閱讀筆記(第4章)Github筆記
- PM2入門實踐指南
- Struts2框架快速入門筆記框架筆記
- [jvm-sandbox-repeater 學習筆記][入門使用篇] 2 配置說明JVM筆記
- TypeScript入門指南(基礎篇)TypeScript
- VT 入門篇——最小 VT 實現(上)
- 機器學習入門筆記系列(10) | K-means 演算法機器學習筆記演算法
- Asp.Net Core學習筆記:入門篇ASP.NET筆記
- JavaScript入門學習學習筆記(上)JavaScript筆記
- substrate學習筆記2:substrate快速入門筆記
- TypeScript入門完全指南(基礎篇)TypeScript
- 【docker】Docker入門到實踐 筆記Docker筆記
- 嵌入式狗的 JAVA 入門筆記·2 程式碼實踐Java筆記
- 《微積分入門》(修訂版)-第31頁-筆記筆記
- 左神直通BAT演算法筆記(基礎篇)-上BAT演算法筆記
- 人臉識別學習筆記一:入門篇筆記
- Nginx入門到實戰(2)場景實現篇Nginx
- vue入門筆記Vue筆記
- Python入門筆記Python筆記
- linux入門筆記Linux筆記
- selenium 入門筆記筆記
- Redis入門筆記Redis筆記
- ByteBuddy入門筆記筆記
- Python 入門筆記Python筆記
- Go入門筆記Go筆記
- NSIS入門筆記筆記
- DFS入門筆記筆記
- ClickHouse入門筆記筆記
- BFS入門筆記筆記
- SQL SERVER 從入門到精通 第5版 第二篇 第9章 檢視的使用 讀書筆記SQLServer筆記
- React實戰入門指南React
- Java工程師學習指南 入門篇Java工程師
- 踩坑指南:入門OpenTenBase之部署篇