前言
我是个菜鸡
一、背包问题
有N种物品,每种物品的数量为C1,C2…Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2…Wn(Wi为整数),与之相对应的价值为P1,P2…Pn(Pi为整数)。求背包能够容纳的最大价值。
其中1 <= N <= 100,1 <= W <= 50000,1 <= Wi, Pi <= 10000, 1 <= Ci <= 200。
二、看题
1.看见题的时候是傻的,因为从来没有接触过这类题,但发现和01背包有些像,就果断引入一个控制个数的变量
2.读入数据
有N种物品,每种物品的数量为C1,C2…Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2…Wn(Wi为整数),与之相对应的价值为P1,P2…Pn(Pi为整数)。求背包能够容纳的最大价值。
其中1 <= N <= 100,1 <= W <= 50000,1 <= Wi, Pi <= 10000, 1 <= Ci <= 200。
#include <stdio.h>
#include <stdlib.h>
int dp[50010],w[110],v[110],s[110];
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
int n,m,i,j,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d%d%d",&w[i],&v[i],&s[i]);
for(i=1;i<=n;i++)
{
for(j=m;j>=w[i];j--)
{
for(k=0;k<=s[i]&&k*w[i]<=j;k++)
dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]);
}
}
printf("%d",dp[m]);
}
总结
卡了两天,一直没有想明白哪个地方弄错了,最后检查的时候把数组开大点,啪的一下就过了。和01背包很像,但是需要控制好个数,以及数组的大小,尽量转化为一维数组,二维内存会容易炸。