文章

22

粉丝

0

获赞

83

访问

4.3k

头像
Buyer C语言题解:动态规划0-1背包问题
P1567
发布于2026年3月26日 15:48
阅读数 157

#include <stdio.h>
#define M 1001

int path[M][M];//标记物品选择情况
int cost[M],val[M];
int dp[M];//动态规划数组

int main()
{
    int m,n,i,j,k;
    while(scanf("%d %d",&m,&n)!=EOF){
        for(i=0;i<n;i++){
            scanf("%d %d",&cost[i],&val[i]);
        }
        for(j=0;j<=m;j++){
            dp[j]=0;
        }
        for(i=0;i<M;i++){
            for(j=0;j<M;j++){
                path[i][j]=0;
            }
        }

        for(i=0;i<n;i++){//开始动态规划
            for(j=m;j>=cost[i];j--){//逆序,可参考上一轮结果
                if(dp[j]<dp[j-cost[i]]+val[i]){
                    dp[j]=dp[j-cost[i]]+val[i];
                    for(k=0;k<M;k++){//将物品选择情况也克隆
                        path[j][k]=path[j-cost[i]][k];
                    }
                    path[j][i]=1;
                }
            }
        }

        if(dp[m]==0){
            printf("0\n");
            continue;
        }
        printf("%d\n",dp...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发