有n種物品,每種物品的數量為c1,c2......cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2......wn(wi為整數),與之相對應的價值為p1,p2......pn(pi為整數)。求揹包能夠容納的最大價值。
input
第1行,2個整數,n和w中間用空格隔開。n為物品的種類,w為揹包的容量。(1
<= n
<= 100,1
<= w <= 50000)
第2 - n + 1行,每行3個整數,wi,pi和ci分別是物品體積、價值和數量。(1
<= wi, pi
<= 10000, 1
<= ci <= 200)
output
輸出可以容納的最大價值。
input示例36
2253
3814
1output示例
9
典型的多重揹包問題,可是我用的是01揹包的做法,記得之前也是這樣子做。
這裡就是把多重揹包拆分成01揹包的做法。
我之前是1,1,1,1,1.
...拆的,然後t了。
所以呢,要對此進行優化一下。
怎麼優化呢,我們可以根據二進位制來拆分揹包。
既拆分成1,2,4,8,....... ,( 1
<<(n-1) )
那麼ci怎麼變化的,就是每一次拆分ci- 1
<<(i+1),
最後還有對ci進行討論,如果不為0,需要再開乙個空間存剩下的。
然後01揹包,dp[j]=max(dp[j],dp[j-w[i]]+v[i]).
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mod 1000000007
#define fir first
#define sec second
#define fin freopen("/home/ostreambaba/文件/input.txt", "r", stdin)
#define fout freopen("/home/ostreambaba/文件/output.txt", "w", stdout)
#define mes(x, m) memset(x, m, sizeof(x))
#define pii pair
#define pll pair
#define inf 1e9+7
#define pi 4.0*atan(1.0)
#define lowbit(x) (x&(-x))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
double eps = 1e-12;
const
int maxn = 50010;
using
namespace
std;
inline
int read()
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*op;
}int main()
if(p!=0)
}int dp[maxn];
mes(dp,0);
for(int i=0;ifor(j=w;j>=n[i];--j)
}cout
0;}
51NOD 1086 揹包問題 V2
1086 揹包問題 v2 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相對應的價值為p1,p2.pn pi為整數 求揹包能夠容納...
51nod1086 揹包問題 V2
我都快不會寫二進位制優化多重揹包了。卡了一下常數從rank100 到20 include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i ...
51Nod 1086揹包問題 V2
1086 揹包問題 v2 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相對應的價值為p1,p2.pn pi為整數 求揹包能夠容納...