1. 程式人生 > 實用技巧 >【遞推】P1028數的計算

【遞推】P1028數的計算

題目相關

題目描述

我們要求找出具有下列性質數的個數(包含輸入的正整數 n)。

先輸入一個正整數 n(n ≤1000),然後對此正整數按照如下方法進行處理:

  1. 不作任何處理;
  2. 在它的左邊加上一個正整數,但該正整數不能超過原數的一半;
  3. 加上數後,繼續按此規則進行處理,直到不能再加正整數為止。

輸入格式

1 個正整數 n(n≤1000)

輸出格式

1 個整數,表示具有該性質數的個數。

輸入輸出樣例

輸入

6

輸出

6

說明/提示

滿足條件的數為

6,16,26,126,36,136

原題連結

P1028 數的計算 - 洛谷

分析

先閱讀完題目,可以嘗試先進行列表然後找規律。

n fun(n)
1 1
2 fun(1)+1=1+1=2
3 fun(1)+1=1+1=2
4 fun(1)+fun(2)+1=1+2+1=4
5 fun(1)+f(2)+1=1+2+1=4
6 fun(1)+fun(2)+fun(3)+1=1+2+2+1=6

觀察一下可以發現規律,從fun(n)的值是fun(1) ~ fun(n/2)的總和加上1。

int sum=0;
for(int i=1;i<=n/2;i++){
    sum+=fun(i);
}

程式碼實現

#include <iostream>
using namespace std;
int main(){	
	int n;
	int fun[1005]={0};
	cin>>n;
	for(int i=1;i<=n;i++){
	//	fun[i]=fun[1]+fun[2]+...+fun[i/2] + 1;
		for(int j=1;j<=i/2;j++){//累加fun[1]~fun[i/2] 
			fun[i]+=fun[j];
		}
		fun[i]++;//加上自己 1
	}
	cout<<fun[n]; 
    return 0;
}