标签: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