llllmz

导航

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

结果:

posted on 2024-03-12 10:32  神奇的萝卜丝  阅读(13)  评论(0)    收藏  举报