动态规划: 投资分配问题

c++版本: 

#include<iostream>
#include<cstring>  //C++中memset函数所需要的头文件
using namespace std;
int main()
{
    int m,n;
    int a;
    cout<<"请输入工厂的个数:";
    cin>>m;
    cout<<"请输入每个投资种类的个数:";
    cin>>n;
    cout<<"请输入投资总金额:";
    cin>>a;

   int array[m][n]; //创建一个数组array:每个工厂在所有可能投资下的获取利润
    int array1[m][n];//创建一个数组array1:在某投资额下前M个工厂可以获取的最大利润
    int path[m][n]; //创建一个数组path:记录在某总投资额下投资一部分资金给第M个工厂时获取最大利润时,这个部分投资额的数值
    memset(array,0,sizeof(array));   //将数组array的值初始化为0
    memset(array1,0,sizeof(array1));  //将数组array1的值初始化为0
    memset(path,0,sizeof(path));    //将数组path的值初始化为0


    cout<<"请依次输入每个工厂在所有可能投资下的获取利润:";
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>array[i][j];
        }
    }

    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i==0)
            {
                array1[i][j]=array[i][j];       //第一个工厂直接全部分配给自己
                if(array[i][j]>path[i][j])
                {
                    path[i][j]=j;  //全部投资额都给自己
                }
            }
            else{
                for(int k=0;k<n;k++)
                {
                    if(j-k>=0) //保证投资给除了自己的工厂外不能大于总投资额
                    {
                         if(array[i][k]+array1[i-1][j-k]>array1[i][j]) //获取收益最大值时投资给自己的投资额
                        {
                            array1[i][j]=array[i][k]+array1[i-1][j-k];//更新
                            path[i][j]=k;    //记录投资给自己多少
                        }
                    }
                    else{
                        break;
                    }

                }
            }
        }
    }
    cout<<"最大利润为:"<<array1[m-1][n-1]<<endl;
    a=a/10;
    for(int i=m-1;i>=0;i--)
    {
        cout<<"第"<<i+1<<"个工厂投资为:"<<path[i][a]*10<<endl;
        a-=path[i][a];
    }
}

 

c版本:

c其实和c++差不多,思想都是一样的,只是头文件不一样,输入输出换为了scanf和printf。

#include<stdio.h>
#include<string.h>  //C中memset函数所需要的头文件

int main()
{
    int m,n;
    int a;
    printf("请输入工厂的个数:");
    scanf("%d",&m);
    printf("请输入每个投资种类的个数:");
    scanf("%d",&n);
    printf("请输入投资总金额:");
    scanf("%d",&a);

    int array[m][n]; //创建一个数组array:每个工厂在所有可能投资下的获取利润
    int array1[m][n];//创建一个数组array1:在某投资额下前M个工厂可以获取的最大利润
    int path[m][n]; //创建一个数组path:记录在某总投资额下投资一部分资金给第M个工厂时获取最大利润时,这个部分投资额的数值
    memset(array,0,sizeof(array));   //将数组array的值初始化为0
    memset(array1,0,sizeof(array1));  //将数组array1的值初始化为0
    memset(path,0,sizeof(path));    //将数组path的值初始化为0

    printf("请依次输入每个工厂在所有可能投资下的获取利润:");
    int i,j,k;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&array[i][j]);
        }
    }

    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            if(i==0)
            {
                array1[i][j]=array[i][j];       //第一个工厂直接全部分配给自己
                if(array[i][j]>path[i][j])
                {
                    path[i][j]=j;  //全部投资额都给自己
                }
            }
            else{
                for(k=0;k<n;k++)
                {
                    if(j-k>=0) //保证投资给除了自己的工厂外不能大于总投资额
                    {
                         if(array[i][k]+array1[i-1][j-k]>array1[i][j]) //获取收益最大值时投资给自己的投资额
                        {
                            array1[i][j]=array[i][k]+array1[i-1][j-k];//更新
                            path[i][j]=k;    //记录投资给自己多少
                        }
                    }
                    else{
                        break;
                    }

                }
            }
        }
    }
    printf("最大利润为:%d \n",array1[m-1][n-1]);
    a=a/10;
    for(i=m-1;i>=0;i--)
    {
        printf("第%d个工厂投资为:%d \n",i+1,path[i][a]*10);
        a-=path[i][a];
    }
}

 

运行结果: 

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_39450145

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值