算法之一动态规划

    xiaoxiao2021-03-25  60

    问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

    对于一种物品,要么装入背包,要么不装。所以对于一种物品的装入状态可以取0和1.我们设物品i的装入状态为xi,xi∈ (0,1),此问题称为0-11背包问题。

    数据:物品个数n=5,物品重量w[n]={2,2,6,5,4},物品价值V[n]={6,3,5,4,6}。

    编码:

    #include<iostream> using namespace std; int main(){ int i,j; int w[10],v[10]; int dp[10][100]={0}; int n,c; printf("物品个数和背包容量:\n"); scanf("%d %d",&n,&c); printf("输入物品重量和价值:\n"); for(i=1;i<=n;i++){ scanf("%d %d",&w[i],&v[i]); } for(i=1;i<=n;i++){ for(j=0;j<=c;j++){ if(j<w[i]){ dp[i][j]=dp[i-1][j]; } else dp[i][j]=dp[i-1][j]>dp[i-1][j-w[i]]+v[i]?dp[i-1][j]:dp[i-1][j-w[i]]+v[i]; } } int x[10]={0}; j=c; for(i=n;i>=1;i--){ if(dp[i][j]>dp[i-1][j]){ x[i]=1; j=j-w[i]; } } printf("%d\n",dp[n][c]); for(i=1;i<=n;i++){ printf("%d ",x[i]); } }

    输出结果:

    可借助表格来帮助理解,重点在状态转移公式上

    转载请注明原文地址: https://ju.6miu.com/read-34745.html

    最新回复(0)