股民解套问题用蛮力法和回溯法如何解决?

某股民投资某证券,购入该证券时间作为起始点0,当天的盈亏也定为0。假定证券价格每个交易日的变化有三档:比前一个交易日上涨1个单位,与前一个交易日持平,比前一个交易日下跌1个单位。
该股民对其持有证券的收益期望值是k个单位。即:只要该证券的价格比其购入的价格高k个单位,他就会卖出该证券获利了结;反之,如果没有达到预期的利润,他就会继续持有该证券,持有的天数最多为N个交易日。在第N个交易日,股民已经失去了耐心,无论是否达到收益预期,证券都会被该股民卖出。
用C语言实现使该股民在第N以及第N个交易日以内获利k个单位的证券每日价格走势组合,并统计符合条件的价格走势总数。
两种算法:蛮力法、回溯法。

阅读 1.5k
1 个回答

蛮力法:

#include <stdio.h>

int count = 0;

void backtrack(int current_price, int buy_price, int days_left, int profit_goal) {
    if (days_left == 0) {
        if (current_price - buy_price >= profit_goal)
            count++;
        return;
    }

    // 价格上涨1个单位
    backtrack(current_price + 1, buy_price, days_left - 1, profit_goal);
    // 价格持平
    backtrack(current_price, buy_price, days_left - 1, profit_goal);
    // 价格下跌1个单位
    backtrack(current_price - 1, buy_price, days_left - 1, profit_goal);
}

int main() {
    int N, k;
    printf("请输入持有天数N和收益期望值k: ");
    scanf("%d %d", &N, &k);

    backtrack(0, 0, N, k);

    printf("符合条件的价格走势总数为: %d\n", count);

    return 0;
}

回溯法:

#include <stdio.h>

int count = 0;

void backtrack(int current_price, int buy_price, int days_left, int profit_goal) {
    if (current_price - buy_price >= profit_goal || days_left == 0) {
        if (days_left == 0)
            count++;
        return;
    }

    // 价格上涨1个单位
    backtrack(current_price + 1, buy_price, days_left - 1, profit_goal);
    // 价格持平
    backtrack(current_price, buy_price, days_left - 1, profit_goal);
    // 价格下跌1个单位
    backtrack(current_price - 1, buy_price, days_left - 1, profit_goal);
}

int main() {
    int N, k;
    printf("请输入持有天数N和收益期望值k: ");
    scanf("%d %d", &N, &k);

    for (int i = k; i <= N; i++) {
        backtrack(0, 0, i, k);
    }

    printf("符合条件的价格走势总数为: %d\n", count);

    return 0;
}
推荐问题