您的位置:首页 > 其它

hihocoder #1043 : 完全背包

2016-09-27 21:40 337 查看
写法参考http://blog.csdn.net/axuan_k/article/details/46008159

一维数组方法一:

#include <cstdio>

#include <cstring>

#include <iostream>

#include <string>

#include <cmath>

#define LL long long

using namespace std;

const int inf = 0x3f3f3f3f;

const int N = 625;

int dp[100005];

int main()

{

    int n, m, i, j;

    int v
, w
;

    scanf("%d %d", &n, &m);

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

    {

        scanf("%d %d", &w[i], &v[i]);

    }

    memset(dp, 0,  sizeof(dp));

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

    {

        for(j=w[i]; j<=m; j++)

        {

            dp[j] = max(dp[j], dp[j-w[i]]+v[i]);

        }

    }

    printf("%d\n", dp[m]);

    return 0;

}

一维数组方法二:

#include <cstdio>

#include <cstring>

#include <iostream>

#include <string>

#include <cmath>

#define LL long long

using namespace std;

const int inf = 0x3f3f3f3f;

const int N = 625;

int dp[100005];

int main()

{

    int n, m, i, j, k;

    int v
, w
;

    scanf("%d %d", &n, &m);

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

    {

        scanf("%d %d", &w[i], &v[i]);

    }

    memset(dp, 0,  sizeof(dp));

    int ans = 0;

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

    {

        for(j=0; j<=m; j++)

        {

            for(k=0; k*w[i]<=j; k++)

            {

                dp[j]=max(dp[j], dp[j-k*w[i]]+k*v[i]);

            }

            if(ans<dp[j])

            ans = dp[j];

        }

    }

    printf("%d\n", ans);

    return 0;

}

二维数组 和一维数组方法二 类似:

#include<iostream>

#include<cstdio>

#include<cstring>

#define MAXN 505

using namespace std;

int dp[505][100005];

int w[550];

int v[550];

int main()

{

    int n, m, k , t, Max;

    while(~scanf("%d%d",&n,&m))

    {

        memset(dp,0,sizeof(dp));

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

            scanf("%d%d",&w[i],&v[i]);

        Max = 0;

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

        {

            for(int j = 1; j <= m; j++)

            {

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

                for(k = 0; k*w[i]<=j; k++)

                {

                    t = dp[i-1][j-k*w[i]]+k*v[i];

                    if(t>Max)

                        Max = t;

                }

                dp[i][j] = Max;

            }

        }

        printf("%d\n", dp
[m]);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: