一道01背包问题,今天把它和现在用一维数组写的代码比了比,发现用一维数组久了慢慢就忽视了背包的本质了,于是试着用三维数组写二维费用背包,wa了无数次,真的是优化了就忘了本质了,检讨一下..
#include<stdio.h>
using namespace std;
struct package
{
int v; //价格
int w; //质量
};
int view_now[1001][1001];
int main()
{
struct package bag[1001];
int c,i,j,m,view_new,view_old;
while((scanf("%d%d",&m,&c))==2&&m!=0&&c!=0)
{ //m是个数,c是容量
for(i=1;i<=m;i++)
scanf("%d%d",&bag[i].w,&bag[i].v);
for(i=0;i<=m;i++)
view_now[i][0]=0;
for(i=0;i<=c;i++)
view_now[0][i]=0;
for(i=1;i<=m;i++)
{ for(j=1;j<=c;j++) // 这个地方的j一定不能从bag[i].w开始,否者view_now[i][0~bag[i].w]这一段都会是没有值的,切记
{
view_now[i][j]=view_now[i-1][j]; //借鉴了用一维写的思路
if(j>=bag[i].w)
view_now[i][j]=max(view_now[i-1][j],view_now[i-1][j-bag[i].w]+bag[i].v);
}
}
printf("%d\n",view_now[m][c]);
}
return 0;
}
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
struct com
{
int v,w;
};
int main()
{
struct com a[1001];
int goal[1001];
int i,j,m,n,s,t,c;
while(cin>>n>>c,c&&n){
for(i=0;i<n;i++)
cin>>a[i].w>>a[i].v;
memset(goal,0,sizeof(goal));
for(i=0;i<n;i++)
{
goal[0]=0; //这个地方可以看到初始化的本质是什么
for(j=c;j>=a[i].w;j--)
{
goal[j]=max(goal[j],goal[j-a[i].w]+a[i].v);
}
}
cout<<goal[c]<<endl;
}
return 0;
}