某股民投资某证券,购入该证券时间作为起始点0,当天的盈亏也定为0。假定证券价格每个交易日的变化有三档:比前一个交易日上涨1个单位,与前一个交易日持平,比前一个交易日下跌1个单位。
该股民对其持有证券的收益期望值是k个单位。即:只要该证券的价格比其购入的价格高k个单位,他就会卖出该证券获利了结;反之,如果没有达到预期的利润,他就会继续持有该证券,持有的天数最多为N个交易日。在第N个交易日,股民已经失去了耐心,无论是否达到收益预期,证券都会被该股民卖出。
有没有人给个思路,用C语言
(一)蛮力法
#include<stdio.h>
#include<iostream>
using namespace std;
int num[3]={1,0,-1};
int paths[1000][1000];
int len[1000]={0};
int index=0;
int target=0;
void dfs(int n,int step,int sum,int path[])
{
if(step>n)
return;
if(sum==target)
{
int i=0;
for(;i<step;i++)
{
paths[index][len[index]++]=path[i];
}
index++;
return;
}
int i=0;
for(i;i<3;i++)
{
path[step]=num[i];
dfs(n,step+1,sum+num[i],path);
}
return;
}
int main()
{
int n,path[1000]={0};
scanf("%d %d",&n,&target);
dfs(n,0,0,path);
int i=0,j=0;
for(i=0;i<index;i++)
{
for(j=0;j<len[i];j++)
{
printf("%d ",paths[i][j]);
}
printf("\n");
}
printf("count=%d",index);
return 0;
}
(二)递归回溯法
#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
int num[3]={1,0,-1};
int paths[1000][1000];
int len[1000]={0};
int index=0;
int target=0;
void backtracking(int n,int step,int sum,vector<int>path)
{
if(step>n)
return;
if(sum==target)
{ int i=0;
for(;i<step;i++)
{
paths[index][len[index]++]=path[i];
}
index++;
return;
}
int i=0;
for(i;i<3;i++)
{
int tempsum=sum+num[i];
if(tempsum+n-step-1>=target)
{
path.push_back(num[i]);
backtracking(n,step+1,tempsum,path);
path.pop_back();
}
}
return;
}
int main()
{
int n;
vector<int>path;
scanf("%d %d",&n,&target);
backtracking(n,0,0,path);
int i=0,j=0;
for(i=0;i<index;i++)
{
for(j=0;j<len[i];j++)
{
printf("%d ",paths[i][j]);
}
printf("\n");
}
printf("count=%d",index);
return 0;
}
动态规划,好像是类似完全背包问题