動態規劃-揹包模板
阿新 • • 發佈:2019-02-12
——>主題
this is code!
#include<bits/stdc++.h>
using namespace std;
const int N = 10000;
int dp[N];
int c[N],w[N],num[N];//分別是價值,重量,數量
int n,m;
void ZeroOne_Pack(int cost,int weight,int m)//01揹包
{
for(int i=m; i>=cost; i--)
dp[i] = max(dp[i],dp[i-cost] + weight);
}
void Complete_Pack(int cost,int weight,int n)//完全揹包
{
for(int i=cost; i<=n; i++)
dp[i] = max(dp[i],dp[i-cost] + weight);
}
int Multi_Pack(int c[],int w[],int num[],int n,int m)//多重揹包
{
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)//遍歷每種物品
{
if(num[i]*c[i] > m)
Complete_Pack(c[i],w[i],m);
//如果全裝進去已經超了重量,相當於這個物品就是無限的
else
{
int k = 1;
//初始化k為1,二進位制壓縮遍歷次數(logk)
while(k < num[i])
{
ZeroOne_Pack(k*c[i],k*w[i],m);
num[i] -= k;
k <<= 1;
}
ZeroOne_Pack(num[i]*c[i],num[i]*w[i],m);
}
}
return dp[m];
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>m>>n;
for(int i=1; i<=n; i++)
cin>>c[i]>>w[i]>>num[i];
cout<<Multi_Pack(c,w,num,n,m)<<endl;
}
return 0;
}