从后面开始选的0、1背包
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#define MAX 509
using namespace std;
int w[MAX],value[MAX];
int a[MAX][MAX];//a[i][c]表示当背包的的容量为c时,可选物品为i,i+1...n-1时,最大的价值
int main(){
int n,v,i,j;
while(~scanf("%d %d",&n,&v)){
for(i=0;i<n;i++){
scanf("%d",&w[i]);
}
for(i=0;i<n;i++){
scanf("%d",&value[i]);
}
int nmax=min(w[n-1],v);
for(i=0;i<nmax;i++)
a[n-1][i]=0;
for(i;i<=v;i++)
a[n-1][i]=value[n-1];
for(i=n-2;i>0;i--){
nmax=min(w[i],v);
for(j=0;j<nmax;j++)
a[i][j]=a[i+1][j];
for(j;j<=v;j++){
a[i][j]=max(a[i+1][j],a[i+1][j-w[i]]+value[i]);
}
}
a[0][v]=a[1][v];
if(w[0]<v) a[0][v]=max(a[1][v],a[1][v-w[0]]+value[0]);
printf("%d\n",a[0][v]);
/*
for(i=0;i<n;i++){
for(j=0;j<=v;j++){
printf("%d ",a[i][j]);
}
puts("");
}
*/
}
return 0;
}
/****
5 10
2 2 6 5 4
6 3 5 4 6
****/
从前开始选的0、1背包
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#define MAX 509
using namespace std;
int w[MAX],value[MAX];
int a[MAX][MAX];//a[i][c]表示当背包的的容量为c时,可选物品为0,1...i时,最大的价值
int main(){
int n,v,i,j;
while(~scanf("%d %d",&n,&v)){
for(i=0;i<n;i++){
scanf("%d",&w[i]);
}
for(i=0;i<n;i++){
scanf("%d",&value[i]);
}
int nmax=min(w[0],v);
for(j=0;j<nmax;j++)
a[0][j]=0;
for(;j<=v;j++)
a[0][j]=value[0];
for(i=1;i<n;i++){
nmax=min(w[i],v);
for(j=0;j<nmax;j++)
a[i][j]=a[i-1][j];
for(;j<=v;j++){
a[i][j]=max(a[i-1][j],a[i-1][j-w[i]]+value[i]);
}
}
/*
for(i=0;i<n;i++){
for(j=0;j<v;j++){
printf("%d ",a[i][j]);
}
puts("");
}
*/
}
return 0;
}
/****
5 10
2 2 6 5 4
6 3 5 4 6
****/