#include <stdio.h>
/***
数组w:代表物品的不同重量
数组v:代表物品的不同价值
数组w和v一一对应,即w[i]重量的商品价值是v[i]
bp表示背包的最大装载物品的重量
***/
static int w[5]= {3,5,1,7,9};
static int v[5]= {10,2,9,15,30};
static int bp=10;
int main() {
/***
初始化二维数组board,大小和bp与w数组有关,用来存储每一步动态规划的出来的计算结果
数组每一行代表一个物品的重量
数组每一列下标代表当前背包的装载重量,数组最大下标就表示背包的最大要求容量
***/
int board[5][11];
for(int n=0; n<5; n++) {
for(int m=0; m<12; m++) {
board[n][m]=0;
}
}
/***
01背包问题公式
board[i][j]=max{board[i-1][j],v[i]+board[i-1][j-w[i]]}
board[i][j]表示当前状态最大价值
***/
for(int ii=0; ii<5; ii++) {
for(int jj=0; jj<11; jj++) {
int i=ii,j=jj;
if(i==0) {
if(w[i]<=j)
board[i][j]=v[i];
} else {
if(w[i]<=j&&v[i]+board[i-1][j-w[i]]>=board[i-1][j]) {
board[i][j]=v[i]+board[i-1][j-w[i]];
} else {
board[i][j]=board[i-1][j];
}
}
}
}
for(int n=0; n<5; n++) {
for(int m=0; m<11; m++) {
printf("%d ",board[n][m]);
}
printf("\n");
}
}