0/1背包问题

【动态规划】0/1背包问题

时间限制: 1 Sec  内存限制: 64 MB
提交: 139  解决: 84
[提交][状态][讨论版][命题人:admin]

题目描述

张琪曼和李旭琳有一个最多能用m公斤的背包,有n块魔法石,它们的重量分别是W1,W2,…,Wn,它们的价值分别为C1,C2,…,Cn。若每种魔法石只有一件,问能装入的最大总价值。

输入

第一行为两整数m和n,以下n行中,每行两个整数Wi,Ci,分别代表第i件物品的重量和价值。

输出

输出一整数,即最大价值。

样例输入

8 3
2 3

5 4

5 5

样例输出

8

 

 

01背包问题,dp[i][j]存收集物品后的最大价值,i遍历所有物品,j从总量开始减少,

#include

#include

#include

#include

#include

#include

#include

#include 

#include 

#include

#include

#define ll long long

using namespace std;

int w[50],v[50];

int dp[300050];

int main()

{

    int c,n,i,j;

    scanf("%d",&c);

    scanf("%d",&n);

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

    {

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

    }

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

    {

        for(j=c; j>=w[i]; j--)

        {

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

        }

    }

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

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

    memset(w,0,sizeof(w));

    memset(v,0,sizeof(v));

return 0;

}

 

你可能感兴趣的:(0/1背包问题)