46. 携带研究材料(第六期模拟笔试)c

背包问题。
#include<stdio.h>
#include<stdlib.h>
int max(int i,int j){
if(i>j) return i;
return j;
}
int main(){
int n1,n2;
scanf("%d %d\n",&n1,&n2);
int* valve=(int*)malloc(sizeof(int)*n1);
int* space=(int*)malloc(sizeof(int)*n1);
for(int i=0;i<n1;i++) scanf("%d",&space[i]);
for(int i=0;i<n1;i++) scanf("%d",&valve[i]);
int** dp=(int**)malloc(sizeof(int*)*n1);//dp[i][j] meaning can choose i thing and have j space
for(int i=0;i<n1;i++) dp[i]=(int*)malloc(sizeof(int)*(n2+1));
for(int i=0;i<n1;i++) dp[i][0]=0;
for(int i=space[0];i<=n2;i++) dp[0][i]=valve[0];
for(int i=1;i<n1;i++){
for(int j=1;j<=n2;j++){
if(space[i]>j){
dp[i][j]=dp[i-1][j];
}else{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-space[i]]+valve[i]);
}
}
}
printf("%d\n",dp[n1-1][n2]);
return 0;
}
结果:

浙公网安备 33010602011771号