HDU 2844 Coins(多重揹包)

2021-06-26 21:15:19 字數 1288 閱讀 2340

以前做題目光僅僅侷限於 0 1 揹包 和 完全揹包了。

出來乙個  個數確定的揹包就不會了。 看了網上的題解。 原來是多重揹包。 也就是說 用完全揹包和 0 1揹包混合求解的題目。

應該是。 對於 vi*a【i】 >= m  那麼就相當於乙個完全揹包。 因為數量可以超過 最大限制。那麼就可以當做無限個使用。

其他的 就需要二進位制來優化了。 比如 13  個 2的話。 就用二進位制來表示 1 個 2     2個 2   4 個 2  6 個 2    因為這樣就可以 把 1 2 3 4 5 6 。。。。這些所有的情況都可以表示出來

比如 5  個 2  就是 1個2 + 4個2   6 就是 2個 2+ 4個2  11 就是 1 + 4 + 6.   所以 當做 0 1 揹包來說的話。 最大表示 只能是 13.   並且可以表示所有的情況。

所以就滿足題意。  就把 原來的  m*(∑a【i】) 變成了  m* (∑log(a【i】))。 優化了很多。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll;

typedef unsigned long long llu;

const double pi=acos(-1.0);

using namespace std;

#define maxn 100+10

#define inf 1 << 30

struct coin;

int main ();

f[0] = 1;

for(int i = 1; i <= n; i++)

scanf("%d",&s[i].v);

for(int i = 1; i <= n; i++)

scanf("%d",&s[i].num);

for(int i = 1; i <= n; i++)

else

}k = s[i].num+1-j;

for(int x = m; x >= s[i].v*k; x--)

f[x] = f[x]|f[x-s[i].v*k];}}

int co = 0;

for(int i = 1; i <= m; i++)

co += f[i];

printf("%d\n",co);

}return 0;

}

HDU 2844 Coins 多重揹包

include include include include include using namespace std define clr c,v memset c,v,sizeof c const int inf 1 30 const int inf 1 30 const int m 1e5 1...

hdu 2844 Coins 多重揹包

題意 給你一些不同價值和一定數量的硬幣,求用這些硬幣可以組合成價值在 1 m 之間的有多少 dp i 來表示容量為i這個包包可以裝多少價值,最後計數是要計價值和容量相等的個數 include include includeusing namespace std int sum,dp 100010 v...

HDU 2844 Coins 多重揹包

source 2009 multi university training contest 3 host by whu 題意 有n種不同的錢幣,每種錢幣的張數給定,問從這些錢幣中可以組合出多少種 範圍為1 m?思路 將不同面值的錢幣看做揹包,符合多重揹包的模型,這裡講每個錢幣的花費和價值都令為它的面...