我的心愿是世界和平!
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 0x3f3f3f3f
int main()
{
dp[0]=0;
for(i=1; i<=sum; i++)
dp[i]=-maxx;
}