动态规划——01背包问题专项研究学习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划——01背包问题专项研究学习相关的知识,希望对你有一定的参考价值。

 1 //背包问题:有m件物品和一个承重为t的背包。第i件物品的重量是w[i],价值是v[i]。
 2 //求解将哪些物品装入背包可使这些物品的重量总和不超过背包承重量t,且价值总和最大。
 3 #include <stdio.h>
 4 #include <conio.h>
 5 #include <string.h>
 6  
 7 int f[1010],w[1010],v[1010];//f记录不同承重量背包的总价值,w记录不同物品的重量,v记录不同物品的价值
 8  
 9 int max(int x,int y){//返回x,y的最大值
10     if(x>y) return x;
11     return y;
12 }
13  
14 int main(){
15     int t,m,i,j;
16     memset(f,0,sizeof(f));  //总价值初始化为0
17     scanf("%d %d",&t,&m);  //输入背包承重量t、物品的数目m
18     for(i=1;i<=m;i++)
19         scanf("%d %d",&w[i],&v[i]);  //输入m组物品的重量w[i]和价值v[i]
20     for(i=1;i<=m;i++){  //尝试放置每一个物品
21         for(j=t;j>=w[i];j--){
22             f[j]=max(f[j-w[i]]+v[i],f[j]);
23             //在放入第i个物品前后,检验不同j承重量背包的总价值,如果放入第i个物品后比放入前的价值提高了,则修改j承重量背包的价值,否则不变
24         }
25     }
26     printf("%d",f[t]);  //输出承重量为t的背包的总价值
27     printf("\n");
28     getch();
29     return 0;
30 }

 

//背包问题:有m件物品和一个承重为t的背包。第i件物品的重量是w[i],价值是v[i]。
//求解将哪些物品装入背包可使这些物品的重量总和不超过背包承重量t,且价值总和最大。
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
int f[1010],w[1010],v[1010];//f记录不同承重量背包的总价值,w记录不同物品的重量,v记录不同物品的价值
 
int max(int x,int y){//返回x,y的最大值
    if(x>y) return x;
    return y;
}
 
int main(){
    int t,m,i,j;
    memset(f,0,sizeof(f));  //总价值初始化为0
    scanf("%d %d",&t,&m);  //输入背包承重量t、物品的数目m
    for(i=1;i<=m;i++)
        scanf("%d %d",&w[i],&v[i]);  //输入m组物品的重量w[i]和价值v[i]
    for(i=1;i<=m;i++){  //尝试放置每一个物品
        for(j=t;j>=w[i];j--){
            f[j]=max(f[j-w[i]]+v[i],f[j]);
            //在放入第i个物品前后,检验不同j承重量背包的总价值,如果放入第i个物品后比放入前的价值提高了,则修改j承重量背包的价值,否则不变
        }
    }
    printf("%d",f[t]);  //输出承重量为t的背包的总价值
    printf("\n");
    getch();
    return 0;
}

以上是关于动态规划——01背包问题专项研究学习的主要内容,如果未能解决你的问题,请参考以下文章

动态规划_01背包_完全背包_多重背包_分组背包

背包问题-动态规划

动态规划问题3--多重背包

动态规划问题3--多重背包

#学习记录# 算法-动态规划-背包九讲(一)

动态规划学习笔记(updating)