您的位置:首页 > 其它

51Nod(1086)

2017-08-09 11:21 148 查看
多重背包板子题。

我要重新练dp了

,好特么菜。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

int d[55000],n,m;

void zeroonepack(int w,int p)
{
for(int i=m;i>=w;i--)
if(d[i]<d[i-w]+p) d[i]=d[i-w]+p;
}

void completepack(int w,int p)
{
for(int i=w;i<=m;i++)
if(d[i]<d[i-w]+p) d[i]=d[i-w]+p;
}

void multipack(int w,int p,int c)
{
if(w*c>=m) completepack(w,p);
else
{
int k=1;
while(k<c)
{
zeroonepack(k*w,k*p);
c-=k;
k*=2;
}
zeroonepack(c*w,c*p);
}
}

int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(d,0,sizeof(d));
for(int i=0;i<n;i++)
{
int w,p,c;
scanf("%d%d%d",&w,&p,&c);
multipack(w,p,c);
}
cout<<d[m]<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: