01揹包模板 完全揹包 and 多重揹包(模板)

2021-08-03 09:57:50 字數 2026 閱讀 5616

模版就直接貼**:

01揹包模板:

[cpp]view plain

copy

print?

/*01揹包問題

01揹包問題的特點是,">每種物品僅有一件,可以選擇放或不放。

01揹包問題描述:

有n件物品和乙個容量為v的揹包。第i件物品的重量是c[i],價值是w[i]。

求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。

*/#include 

#define n 1050017

intmax(

intx,

inty)  

intwei[n],val[n],f[n];  

intmain()  

printf("%d\n"

,f[m]);  

}  return

0;  

}  //此**為poj3624

完全揹包模板:

[cpp]view plain

copy

print?

/*完全揹包問題的特點是,每種物品可以無限制的重複使用,可以選擇放或不放。

完全揹包問題描述:

有n物品和乙個容量為v的揹包。第i件物品的重量是wei[i],價值是val[i]。

*/#include 

#define inf 0x3fffffff

#define n 10047

intf[n],val[n],wei[n];  

intmin(

inta,

intb)  

intmain()  

f[0]=0;//因為此處假設的是小豬儲錢罐 恰好裝滿 的情況

//注意初始化(要求恰好裝滿揹包,那麼在初始化時除了f[0]為0其它f[1..v]均設為-∞,

//這樣就可以保證最終得到的f[n]是一種恰好裝滿揹包的最優解。

//如果並沒有要求必須把揹包裝滿,而是只希望**盡量大,初始化時應該將f[0..v]全部設為0)

for(i =0 ; i < n ; i++)  

}  if(f[c] == inf)  

printf("this is impossible.\n"

);  

else

printf("the minimum amount of money in the piggy-bank is %d.\n"

,f[c]);  

}  return

0;  

}  //此**為hdu1114;

f[w] 即為所求

初始化分兩種情況:

1、如果揹包要求正好裝滿則初始化 f[0] = 0, f[1~w] = -inf;

2、如果不需要正好裝滿 f[0~v] = 0;

多重揹包模板:

[cpp]view plain

copy

print?

//多重揹包(multiplepack): 有n種物品和乙個容量為v的揹包。

//第i種物品最多有n[i]件可用,每件費用是c[i],價值是w[i]。

//求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,

//且價值總和最大。

//hdu 2191

#include 

#include 

#define n 247

intmax(

inta,

intb)  

intmain()  

for(i = 0 ; i < m ; i++)  

}  }  printf("%d\n"

,f[n]);  

}  }  

return

0;  

}  

01揹包模板 完全揹包 and 多重揹包(模板)

01揹包模板 01揹包問題 01揹包問題的特點是,每種物品僅有一件,可以選擇放或不放。01揹包問題描述 有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。include define n 1050017...

01揹包 完全揹包 多重揹包模板

01揹包問題真的是最最基礎的,完全揹包就將01揹包的乙個迴圈順序顛倒了下,多重揹包就是在01揹包基礎上加了乙個迴圈。本文是在學習了 揹包九講 後的總結和實現,感謝大神寫的揹包指導。多重揹包可以用二進位制來表示,不過不是很理解,先貼出最簡單的轉化為01揹包 01揹包 includeusing name...

多重揹包 完全揹包 01揹包模板

多重揹包問題 多重揹包問題限定了一種物品的個數,解決多重揹包問題,只需要把它轉化為0 1揹包問題即可。比如,有2件價值為5,重量為2的同一物品,我們就可以分為物品a和物品b,a和b的價值都為5,重量都為2,但我們把它們視作不同的物品。include using namespace std defin...