2014/9/26
多重背包好简单~~我竟然2A了啦啦啦(不会告诉你们因为dp没有初始化wa了一发的= =)
多重背包和完全背包:
第二重循环方向不一样~~多重是MAXN-> 0
请叫我雷锋QAQ
//Ñô¹â´ÌÍ´Ë«íø
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<map>
#include<climits>
#include<vector>
using namespace std;
typedef long long ll;
#define f(x,y,i) for(int i = x;i < y; i++)
#define ff(x,y,i) for(int i = x;i <= y; i++)
#define F(x,y,i) for(int i = x; i >= y; i--)
#define FF(x,y,i) for(int i = x; i > y; i++)
#define lson pos<<1,l,mid
#define rson pos<<1|1,mid+1,r
#define sc(n) scanf("%d",&n)
#define pr(n) printf("%d\n",n)
#define met(n,m) memset(n, m, sizeof(n))
#define mod 10007
#define inf 0x7f
const int N=150;
int Max(int a,int b)
{
return a>b?a:b;
}
int Min(int a,int b)
{
return a<b?a:b;
}
int v[N],w[N],num[N];
int dp[N];
int main()
{
int tot , n, m , k;
while(~scanf("%d",&tot))
{
while(tot--)
{
met(dp,0);
scanf("%d%d",&n,&m);
f(0, m, i)
scanf("%d%d%d",&w[i],&v[i],&num[i]);
for(int k = 0;k < m; k++)
for(int i = n; i>= w[k]; i--)
{
for(int j = 1;j <= num[k]&&j*w[k]<= i; j++)
{
dp[i]=Max(dp[i],dp[i - j*w[k]]+j*v[k]);
}
}
printf("%d\n",dp[n]);
}
}
return 0;
}