动态规划算法实现收益最大C++

#include <iostream>
using namespace std;
typedef struct
{
    float benefit;
    int A,B,C;
}Allot;
void AddChoice(Allot *Fx,float **temp,int stage,int n,float *fx[4])
{
    int i,j;
    for(i=0;i<=n;i++)
        for(j=0;j<=i;j++)
            temp[i][j]=fx[stage][j]+Fx[i-j].benefit;
}
void Updata(Allot *Fx,Allot *fore,int stage,int i,int j,int n)
{
    int t;
    if(stage==2)
    {
        Fx[i].B=j;Fx[i].A=i-j;Fx[i].C=0;
    }
    else if(stage==3)
    {
        Fx[i].C=j;
        t=i-j;
        Fx[i].A=fore[t].A;Fx[i].B=fore[t].B;
    }
}
void Findmax(Allot *Fx,float **temp,int stage,int n)
{
    int i,j,pos,t;
    Allot fore[n+1];
    for(t=0;t<=n;t++)
        fore[t]=Fx[t];
    for(i=0;i<=n;i++)
    {
        for(j=0;j<=i;j++)
        {
            if(temp[i][j]>=Fx[i].benefit)
            {
                Fx[i].benefit=temp[i][j];
                pos=j;
            }
        }
        Updata(Fx,fore,stage,i,pos,n);
    }
}
int main()
{
    Allot *Fx;
    char project='A';
    float *fx[4],**temp;
    int n,i,j,fund;
    cout<<"输入一个项目最多分配的资金:";
    cin>>n;
    for(i=0;i<=3;i++)
        fx[i]=new float[n+1];
    cout<<"输入三个项目的投资效益(以0开始):"<<endl;
    for(i=1;i<=3;i++)
    {
        cout<<"项目"<<char(project+i-1)<<":";
        for(j=0;j<=n;j++)
            cin>>fx[i][j];
    }
    Fx=new Allot[n+1];
    for(i=0;i<=n;i++)
    {
        Fx[i].benefit=fx[1][i];Fx[i].A=i;Fx[i].B=Fx[i].C=0;
    }
    temp=new float *[n+1];
    for(i=0;i<=n;i++)
        temp[i]=new float[n+1];
    for(i=2;i<=3;i++)
    {
        AddChoice(Fx,temp,i,n,fx);
        Findmax(Fx,temp,i,n);
    }
    cout<<"\n请输入投资金额:";
    cin>>fund;
    cout<<"最大收益为:"<<Fx[fund].benefit<<"\n各个项目资金分配:   A:"<<Fx[fund].A<<"   B:"<<Fx[fund].B<<"   C:"<<Fx[fund].C<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值