首页 > 编程知识 正文

背包问题c语言代码,贪心算法背包问题c语言代码

时间:2023-05-05 22:24:33 阅读:22355 作者:1053

有n种类型的项目和容量为v的背包,每个项目都有无限的项目。 第I个项目的体积是vi,价值是wi。 解开把什么样的物品放在背包里,这些物品的总体积不会超过背包的容量,并且总价值最大。 输出最大的价值。 在格式的第一行中输入两个整数,n,v,用空格分隔,分别表示物品的种类数和背包的容积。 接下来有n行。 每一行有两个整数vi,wi,用空格分隔。 分别表示第I项的体积和价值。 输出表示最大价值的整数。 数据范围0N、V10000vi、wi1000输入样本4 51 22 43 44 5输出样本: 10I0时,dp[i][j]可能有两种。 1 .不放第I个物品,即DP[I1][j],同样的01背包; 2 .放入第I个商品。 在这种情况下,与01背包不同,各商品有无限个(但是注意包的重量限制是有限的),所以在这种情况下,不应该转移到DP[I1][jw[I]],而是转移到DP[I1][jw[I]] 也就是说,放入第I商品后也可以继续放入第I商品。 因此,状态转移方程为dp[i][j]=max(dp[i1][j],DP [ I ] [ jw [ I ] v [ I ] ] # include stdio.h # definen 1005 int DP [ n ] int w[N]; //记录每件物品重量的int v[N]; //记录每件物品价值的intmax(inta,int b ) ) return ) ab? a : b; (}int main ) ) {int n,m; scanf('%d%d ),n,m ); //n为物品,m为背包尺寸for(intI=1; i=n; I )扫描(' % d % d ),v ) I ),w ) I ); dp[0][0]=0; for(intI=1; i=n; I ) for(intj=0; j=m; j({DP[I][j]=DP[I-1][j]; if(j=v(I ) ) DP (I ) ) j ) ) max ) DP ) I )、DP ) I ) ) j-v ) I ) w ) I ); //注意,此处迁移到I的不是I-1}printf('%d”,dp[n][m] ); 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。