#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;
}
#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;
}