01揹包:每種物體只有1個,可選擇取或不取
完全揹包:每種物體有無數個(當每種物體 重量w * 個數 c >= 揹包容量 v 時,可視為完全揹包)
多重揹包:每種物體有c[ i ]個
將個數c拆分成1,2,4,...,2^(k - 1),c - (2 ^ k - 1)
拆分為二進位制則可表示1到c任意的數字。
while ( int x) //x為該種物品的總個數
int t = 1;
while (x >= t)
if ( x )
hdu2844
有n種硬幣,面值為a [ i ],個數為c [ i ].手錶最多m元,求硬幣最多能表示多少種**(1..m)
揹包容量m。多重揹包。每種硬幣的重量(費用)、價值均為a [ i ]。
轉化為01揹包後,
for i = 1 to cnt
for j = m to a[ i ]
f [ j ] = max( f [ j ] , f [ j - a [ i ]] + a [ i ] );
最後的 f [ j ]即為考慮了所有的硬幣後,當揹包的容量為j時的最大價值。
因為揹包容量即想要湊出的錢,for i = 1 to m,當f [ i ] = i 時,即所有硬幣可湊出**i,計數 +1。
#include
#include
#include
#include
#include
using
namespace
std;
const
intmaxn =
105;
const
intmaxm =
1e5+ 5;
inta[maxn
],b[
maxn];
intf[
maxm];
vector
<
int> v;
void
change(
intx,
intper)
if(x) }
intmain()
v.clear
();
memset(f
, 0, sizeof(f
));
intans = 0;
for(int
i =
0; i < n; i ++)
for(int
i =
0; i < n; i ++)
for(int
i =
0; i < v.
size
(); i ++) }
for(int
i =
1; i <= m; i ++) }
printf
("%d\n"
,ans); }
return0;
}
hdu 2844 多重揹包)
思路 其實就是多重揹包的應用,只是這裡價值和重量是相等的,因此最後計數是要計價值和重量相等的個數 1 include2 include3 const int n 100010 4 using namespace std 5int n,m 67 struct nodenode n 100 11 int...
hdu2844 多重揹包
讀題能力還是不行,英文水平不夠,只能靠翻譯 華沙人用硬幣。他們有價值a1 a2 a3的硬幣 一枚銀幣。一天,希比克斯開啟錢包,發現裡面有一些硬幣。他決定在附近的一家商店買一塊非常好的手錶。他想支付確切的 不找零 他知道 不會超過m,但他不知道手錶的確切 你要寫乙個程式,它讀取n,m,a1,a2,a3...
hdu 2844 多重揹包
真爽啊 打完一把絕對carry的亞索 來做這題 一發ac touch me 這題 反正資料很大 不用二進位制拆分 肯定tle的 反正 二進位制拆分 很簡單的啊 不會的 現在看我 學下就好了。1 include 2 include 3 using namespace std 45 const int ...