欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

简单的一道题 背包问题

发布时间:2024/10/6 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 简单的一道题 背包问题 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

简单的一道题

时间限制: 1 Sec  内存限制: 128 MB

题目描述

麻烦的渣渣辉又要和女朋友去旅游啦。

他们有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...Wn,它们的价值分别为C1C2...Cn。

有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。

求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

输入

第一行:二个整数,V(背包容量,V<=200),N(物品数量,N<=30);

第2..N+1行:每行三个整数WiCiPi,前两个整数分别表示每个物品的重量,价值,第三个整数若为0,

则说明此物品可以购买无数件,若为其他数字,则为此物品可购买的最多件数(Pi)。

输出

仅一行,一个数,表示最大总价值。

样例输入

10 3 2 1 0 3 3 1 4 5 4

样例输出

11 #include<iostream> #include<cstdio> using namespace std; const int maxn = 1005; int dp[maxn][maxn]; int c[maxn];//重量 int w[maxn];//价值 bool x[maxn];//若为1,则说明此物品可以购买无数件 int main() {int v,n;while(scanf("%d %d",&v,&n) != EOF){int p = 1;//物品个数int a,b,t;//重量,价值,个数for(int i = 1;i <= n; i++){scanf("%d %d %d",&a,&b,&t);if(t == 0){//无数件物品x[p] = true;c[p] = a;w[p] = b;p++;}else{x[p] = false;//t件相同的物品while(t--){c[p] = a,w[p] = b;p++;}//while}//else}//forp--;//初始化for(int i = 0;i < n; i++){dp[i][0] = dp[0][i] = 0;}for(int i = 1;i <= p; i++){//枚举p件物品for(int j = 1;j <= v; j++){//枚举背包容量if(j < c[i]){dp[i][j] = dp[i - 1][j];}else{if(x[i] == true)dp[i][j] = max(dp[i - 1][j],dp[i][j - c[i]] + w[i]);elsedp[i][j] = max(dp[i - 1][j],dp[i - 1][j - c[i]] + w[i]);}//else}//容量}//物品printf("%d\n",dp[p][v]);}return 0; }

 

总结

以上是生活随笔为你收集整理的简单的一道题 背包问题的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。