动态规划之背包问题

#include<iostream>

using namespace std;

 

int dynamic(int *gold,int *num,int n,int sum);

int main()

{

    int n;

    int sum;

    cin>>n;

    while(n!=-1)

    {

        cin>>sum;

        int gold[n];

        int num[n];

        for(int i=0;i<n;i++)

        {

            cin>>num[i];

        }

        for(int i=0;i<n;i++)

        {

            cin>>gold[i];

        }

        cout<<dynamic(gold,num,n,sum)<<endl;

        cin>>n;

    }

    

    return 0;

}

 

 

int max(int a,int b)

{

    int m=a;

    if(b>a)

        m=b;

    return m;

}

int dynamic(int gold[],int num[],int n,int sum)

{

    int list1[sum];

    int list2[sum];

    for(int i=0;i<sum;i++)

    {

        if(i<num[0]-1)

            list1[i]=0;

        else

            list1[i]=gold[0];

    }

    for(int i=1;i<n;i++)

    {

        for(int j=0;j<sum;j++)

        {

            if(j<num[i]-1)

                list2[j]=list1[j];

            else if(j==num[i]-1)

            {

                list2[j]=max(list1[j],list2[j]);

            }

            else

            {

                list2[j]=max(gold[i]+list1[j-num[i]],list1[j]);

            }

        }

        

        for(int k=0;k<sum;k++)

            list1[k]=list2[k];

    }

    

    return list1[sum-1];

}

 

posted @ 2018-10-16 22:51  RDicer  Views(106)  Comments(0)    收藏  举报