背包

来源:互联网 发布:女生喜欢什么礼物知乎 编辑:程序博客网 时间:2024/04/29 22:34

我的心愿是世界和平!

0-1背包

给定背包容量,给任意个物品的重量以及价值,每个物品只有一个,求背包能容纳的最大价值。

#include<stdio.h>#include<iostream>using namespace std;struct Good{    int w;    int v;}good[3410];int dp[12890];int main(){    int m,V,s,i,j;    scanf("%d%d",&m,&V);    for(i=1;i<=m;i++)        scanf("%d%d",&good[i].w,&good[i].v);    for(i=1;i<=m;i++)    {        for(j=V;j>=good[i].w;j--)        {            dp[j]=max(dp[j],dp[j-good[i].w]+good[i].v);        }    }    printf("%d",dp[V]);}

完全背包

给定背包容量,给任意个物品的重量以及价值,每个物品有无数个,求背包能容纳的最大价值。

#include<stdio.h>#include<iostream>using namespace std;struct Good{    int w;    int v;}good[3410];int dp[12890];int main(){    int m,V,s,i,j;    scanf("%d%d",&m,&V);    for(i=1;i<=m;i++)        scanf("%d%d",&good[i].w,&good[i].v);    for(i=1;i<=m;i++)    {        for(j=good[i].w;j<=V;j++)        {            dp[j]=max(dp[j],dp[j-good[i].w]+good[i].v);        }    }    printf("%d",dp[V]);}

多重背包

给定背包容量,给任意个物品的重量以及价值,每个物品有指定个,求背包能容纳的最大价值。

#include<stdio.h>#include<iostream>using namespace std;struct T{    int w;    int v;} t[2001];int dp[2001];int main(){    int T,sum,s,index,pr,wei,num,k,i,j;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&sum,&s);        index=0;        for(i=1; i<=s; i++)//在输入时转化为0-1背包并进行优化.        {            scanf("%d%d%d",&pr,&wei,&num);            k=1;            while(num-k>0)            {                num-=k;                t[++index].v=pr*k;                t[index].w=wei*k;                k*=2;            }            t[++index].v=pr*num;            t[index].w=wei*num;        }        for(i=0; i<=sum; i++)            dp[i]=0;        for(i=1; i<=index; i++)            for(j=sum; j>=t[i].v; j--)                dp[j]=max(dp[j],dp[j-t[i].v]+t[i].w);        printf("%d\n",dp[sum]);    }    return 0;}

若要求使背包刚好装满时背包的最大容量,只需要将dp数组的初始化进行改变即可。

#define maxx 0x3f3f3f3fint main(){    dp[0]=0;    for(i=1; i<=sum; i++)        dp[i]=-maxx;}