題目大意:有m種公尺,給出每種公尺花費,重量和數量,問n元能獲得的最大重量是多少
題目思路:對於每個包,如果數量*花費》n,那麼很明顯直接多重揹包即可,否則就需要用到二進位制拆分法。由於0~2^k-1內所有的數字都可以通過2^0 2^1 2^2......2^(k-1)中若干個數字得到。那麼可以把數量為c的物品拆成p+2個物品,2^0 2^1 2^2......2^(k-1)再來個剩餘的數量,可以表示出剩餘數量~c的所有數字,由於選取其中若干個可以表示所有這一範圍內數字,那麼對這些數字進行01揹包就相當於vi物品取0~ci次。詳細說明可參照《演算法競賽高階指南》一書的多重揹包部分。
以下是**:
#include#include#include#include#includeusing namespace std;
#define inf 0x3f3f3f3f
#define maxn 105
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
struct nodea[maxn];
int dp[maxn];
int main()
memset(dp,0,sizeof(dp));
rep(i,1,m)
}else
temp-=k;
k<<=1;
}per(j,n,temp*a[i].cost)}}
printf("%d\n",dp[n]);
}return 0;
}
HDU 2191 多重揹包
problem description 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙個充滿了...
HDU 2191 多重揹包
急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙個充滿了變數的生命過程,天災 人禍 病痛是我們生...
HDU2191 多重揹包
1.題目鏈結。中文題目就不再說題意了。首先我們知道這個題目的意思就是給你n中物品,每種物品有重量,價值,數量這三個屬性。然後給定乙個數值的錢,問這些錢最可以買多少東西。其實和揹包的思想是一樣的,就是容量為v的揹包最多可以裝多少東西。2.分析 這和我們之前說到的01揹包和完全揹包都是不一樣的,因為01...