0/1背包问题

#include<cstdio>
#include<cstring>
using namespace std;
int store[100][100];
int c[100];
int w[100];
int selected[100];
int main()
{
freopen("in.txt","r",stdin);
int n,knapsack;
while(scanf("%d%d",&n,&knapsack)==2)
{
memset(selected,0,sizeof(selected));
for(int i=1;i<=n;i++)
scanf("%d%d",&c[i],&w[i]);
for(int i=0;i<=n;i++)store[i][0]=0;
for(int i=0;i<=knapsack;i++)store[0][i]=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=knapsack;j++)
{
store[i][j]=store[i-1][j];
if(j>=c[i]&&store[i][j]<store[i-1][j-c[i]]+w[i])
store[i][j]=store[i-1][j-c[i]]+w[i];
}
}
int m=knapsack;
for(int i=n;i>0;i--)
{
if(store[i][m]>store[i-1][m])
{
selected[i]=1;m=m-c[i];
}
}
for(int i=1;i<=n;i++)
if(selected[i])printf("%d\n",i);
printf("%d\n",store[n][knapsack]);
}
return 0;
}








下面是一个模板。总的思路就是把n个物体,依次放入容量为knapsack的背包里面
背包的容量依次从1到knapsack,store的意思是前i个物体放入容量为j的背包里面
所得到的最大量。。。


template<class Type>
Type knapsack_dynamic(int w[],Type p[],int n,int m,bool x[])
{
Type v,(*optp)[m+1]=new Type[n+1][m+1];
for(int i=0;i<=n;i++)
{
optp[i][0]=0;
x[i]=false;
}
for(int i=0;i<=m;i++)optp[0][i]=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
optp[i][j]=optp[i-1][j];
if(j>=w[i]&&optp[i][j]<optp[i-1][j-w[i]]+p[i])
optp[i][j]=optp[i-1][j-w[i]]+p[i];
}
}
int j=m;
for(int i=n;i>0;i--)
{
if(optp[i][j]>optp[i-1][j])
{
x[i]=true;j-=w[i];
}
}
v=optp[n][m];
delete optp;
return v;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值