hdu 2602 Bone Collector

01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] }

f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值。
决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ?
#include<stdio.h>
#include<string.h>
int dp[1010][1010],w[1010],val[1010];
int max(int a,int b){
    return a>b?a:b;
}
int main(){
    int n,m,i,j,t;
    
    scanf("%d",&t);
    while(t--){
        memset(dp,0,sizeof(dp));
        memset(w,0,sizeof(w));
        memset(val,0,sizeof(val));
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++){
            scanf("%d",&val[i]);
        }
        for(i=1;i<=n;i++){
            scanf("%d",&w[i]);
        }
        for(i=1;i<=n;i++){
            for(j=0;j<=m;j++){
                if(j>=w[i]){
                    dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+val[i]);//放还是不放的选择

                }else{
                    dp[i][j]=dp[i-1][j];
                }
            }
        }
        printf("%d\n",dp[n][m]);
    }
    return 0;
}
                
        
               


 

你可能感兴趣的:(dp,01背包)