三種基礎揹包模版

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int inf = (1<<30)-1;
const int maxn = 100000;

int zeroOneBeg1(int n,int w[],int val[],int V)//01揹包可以不裝滿
/*物品數,花費[],價值[],揹包容量,物品下標1開始*/
{
    int f[maxn],i,v;
    for(i = 0; i <= V; i++)
        f[i] = 0;

    for(i = 1; i <= n; i++)
        for(v = V; v >= 0; v--)
   if(v - w[i] >= 0)
    f[v] = max(f[v] , f[V-w[i]]+val[i]);
    return f[V];
}

int zeroOneBeg2(int n,int w[],int val[],int V)//01揹包恰好裝滿
/*物品數,花費[],價值[],揹包容量,物品下標1開始*/
{
    int f[maxn],i,v;
 f[0] = 0;
    for(i = 1; i <= V; i++)
        f[i] = -inf;

    for(i = 1; i <= n; i++)
        for(v = V; v >= 0; v--)
   if(v - w[i] >= 0)
    f[v] = max(f[v] , f[V-w[i]]+val[i]);
    return f[V];
}

int completeBeg(int n,int w[],int val[],int V)//完全揹包
/*物品數,花費[],價值[],揹包容量,物品下標1開始*/
{
 int f[maxn],i,v;
 /*f[0] = 0;
    for(i = 1; i <= V; i++)
        f[i] = -inf;*/
 for(i = 0; i <= V; i++)
        f[i] = 0;
    for(i = 1; i <= n; i++)
        for(v = 0; v <= V; v++)
   if(v - w[i] >= 0)
    f[v] = max(f[v] , f[V-w[i]]+val[i]);
 return f[V];
}

int multipleBeg(int n,int w[],int val[],int nNum[],int V)//多重揹包
/*物品數,花費[],價值[],物品的數量[],揹包容量,物品下標1開始*/
{
 int f[maxn],i,v;
 for(i = 0; i <= V; i++)
        f[i] = 0;

 for(i = 1; i <= n; i++)
 {
  if( V <= w[i] * nNum[i])
  {
   for(v = 0; v <= V; v++)
    if(v - w[i] >= 0)
     f[v] = max(f[v] , f[V-w[i]]+val[i]);
  }
  else
  {
   int k = 1,count = nNum[i];
   while(k < count)
   {
    for(v = V; v >= 0; v--)
     if(v - k*w[i] >= 0)
      f[v] = max(f[v] , f[V-k*w[i]]+k*val[i]);
    count = count - k;
    k = k * 2;
   }
   for(v = V; v >= 0; v--)
    if(v - count*w[i] >= 0)
     f[v] = max(f[v] , f[V-count*w[i]]+count*val[i]);
  }
 }  
 return f[V];

}

 

int main()
{
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章