题意:
给n种硬币的价值和数量,求能凑成【 1, m】之间的多少个数。
解析:
完全背包的入门题。
用dp[ i ] = 0 表示 i 这个数不能凑成;
dp[ i ] = 1表示 i 这个数能凑成。
然后每种数量用多重背包的二进制来拆分,最后遍历一遍即可。
代码:
多重背包(01、完全):
int packV;
int n;
int dp[maxv];
// for (int i = 1; i <= n; i++)
// zeroOnePack(c[i], w[i]);
void zeroOnePack(int cost, int weight)
{
for (int v = packV; v >= cost; v--)
{
dp[v] = max(dp[v], dp[v - cost] + weight);
}
}
// for (int i = 1; i <= n; i++)
// completePack(c[i], w[i]);
void completePack(int cost, int weight)
{
for (int v = cost; v <= packV; v++)
{
dp[v] = max(dp[v], dp[v - cost] + weight);
}
}
void multiplePack(int cost, int weight, int amount)
{
if (packV <= cost * amount)//相当于无限个物品
{
completePack(cost, weight