360 笔试 第一题01背包,帮忙看看有什么错误,一维都对。。二维不对。。
发布于 2017-09-21 09:57 1446 次浏览 0 赞 来自 我要提问  

#include <iostream>
#include<string.h>
#include<algorithm>
using namespace std;



int suan(int a[],int n,int m)//一唯
{

    int dp[1055];
    memset(dp,0,sizeof(dp));
    for(int i=1; i<=n; i++)
        for(int j=m; j>=a[i]; j--)
        {
            if(j>=a[i])
                dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
            //dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);
        }
    //return dp[n][m];
    return dp[m];
}
int suan2(int a[],int n,int m)//二维
{

    int dp[1055][1005];
    memset(dp,0,sizeof(dp));
    for(int i=1; i<=n; i++)
        for(int j=m; j>=a[i]; j--)
        {
            if(j>=a[i])
                //dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);
        }
    return dp[n][m];
    //return dp[m];
}
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        int a[1060];
        int b[1060];
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(int i=1; i<=n; i++)
            cin>>a[i];
        sort(a+1,a+n+1);
        for(int i=1; i<=n-1; i++)
            b[i]=a[i];



        int ans=suan(b,n-1,m-1);
        int ans1=suan2(b,n-1,m-1);
        cout<<ans<<endl;
        cout<<ans1<<endl;
        cout<<ans+a[n]<<endl;
    }
}

1 条回复

 if(j>=a[i])
                //dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);

else 

    dp[i][j] = dp[i-1][j];

2017-09-27 21:29
添加回复
回到顶部