标签:style blog io ar color os sp for on
解题思路:首先是多重背包的概念,即为有一个容量为V的包,现有n个物品,每一个物品的价值为value[i],重量为weight[i],数量是num[i]
则每一个物品可以取1,2,3,---,num[i]件,但对于每一个物品(无论它是否相同都只有取或者不取这两种选择),于是可以转化成01背包
反思:这一道题直接用三重循环不会超时,不需要用到二进制优化
#include<stdio.h>
#include<string.h>
int dp[1000],weight[100],value[100],num[100];
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
int ncase,n,m,i,j,k;
scanf("%d",&ncase);
while(ncase--)
{
memset(dp,0,sizeof(dp));
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
scanf("%d %d %d",&value[i],&weight[i],&num[i]);
for(i=1;i<=m;i++)
{
for(k=1;k<=num[i];k++)
{
for(j=n;j>=value[i];j--)
{
dp[j]=max(dp[j],dp[j-value[i]]+weight[i]);
}
}
}
printf("%d\n",dp[n]);
}
}
标签:style blog io ar color os sp for on
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4156677.html