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;
}
}
我要重新练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;
}
}
相关文章推荐
- 51Nod 1086 背包问题 V2(二进制多重背包)
- 51nod 1086【背包·DP】
- 多重背包模板 51Nod 1086
- 51Nod 1086 背包问题 V2(二进制多重背包)
- 51nod 1086
- 【多重背包】51nod 1086 背包问题 V2
- 51Nod:1086背包问题 V2
- AC日记——背包问题 V2 51nod 1086
- 51nod 1086 背包问题 V2(多重背包)
- 51nod 1086 背包问题V2 (巧妙dp,二进制)
- 51nod 1086 背包问题 V2 (多重背包问题)
- 51nod 1086 背包问题 V2 (多重背包)
- 51Nod 1086【背包问题 V2】
- 51nod 1086 背包问题 V2 多重背包
- 51nod 1086 背包问题 V2
- 【51Nod 1086】背包问题 V2
- 51Nod 1086 背包问题 V2(多重背包)
- 51nod 1086 背包问题 V2
- 51nod-1086 多重背包
- 51NOD-1086 背包问题 V2(多重背包)