HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包裸题)


            一道多重背包的裸题,想看详解的可以看这篇博客传送门(Coins)


AC代码:

#include 
#include 
#define MAX(a,b) a>b?a:b
#define MAXN 100000
#define INF 0x3f3f3f3f
using namespace std;
int dp[MAXN];
int val[205];
int w[205];
int num[205];
int T,n,m;

void CompletePack(int val,int w){
  for(int i=val;i<=n;i++){
    dp[i] = MAX(dp[i],dp[i-val] + w);
  }
}

void ZeroPack(int val,int w){
  for(int i=n;i>=val;i--){
    dp[i] = MAX(dp[i],dp[i-val]+w);
  }
}

void MutiplePack(int val,int w,int num){
  if(val * num > n){
    CompletePack(val,w);
  }
  else {
    int k = 1;
    while(k<=num){
      ZeroPack(k*val,k*w);
      num -= k;
      k *= 2;
    }
    ZeroPack(num*val,num*w);
  }
}

int main()
{
  scanf("%d",&T);
  while(T--){
    scanf("%d%d",&n,&m);
    for(int i=0;i




你可能感兴趣的:(ACM_动态规划)