背包问题

来源:互联网 发布:网络延迟怎么解决 编辑:程序博客网 时间:2024/06/08 08:18

第一次写博,记录学习过程。
01背包
主要: a[i][j] = max(a[i-1][j-wi[i]]+va[i], a[i-1][j]);
前提条件为物品质量大于背包质量。放上一件物品(a[i-1][j])的时候,背包的质量与 添加当前物品(a[i-1][j-wi[i]]+va[i]),“a[i-1][j-wi[i]]”为放当前物品之前的背包状态,“va[i]”为当前物品的价值。

#include<stdio.h>#include<string.h>int max(int x,int y){    if(y>x)        return y;    return x;}int main(){    int n,m,a[100][100];    while(scanf("%d %d",&n,&m)!=EOF){        memset(a,0,sizeof(a));        int wi[n+5],va[n+5];        for(int i = 1; i <= n; i++){            scanf("%d %d", &wi[i], &va[i]);        }        for(int i=1;i<=n;i++){            for(int j=1;j<=m;j++){                if(wi[i]<=j){                    a[i][j] = max(a[i-1][j-wi[i]]+va[i], a[i-1][j]);//第一次出错(a[i][j-wi[i]]+va[i]应该改为“a[i-1][j-wi[i]]+va[i]”)                 }else{                    a[i][j] = a[i-1][j];                }            }        }        for(int i=1;i<=n;i++){            for(int j=1;j<=m;j++){                printf("%d ",a[i][j]);            }            printf("\n");        }    }    return 0;} 
0 0