0/1背包问题
一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,…,WnW1,W2,…,Wn,它们的价值分别为C1,C2,…,CnC1,C2,…,Cn,求旅行者能获得最大总价值。
【输入】
第一行:两个整数,MM(背包容量,M<=200M<=200)和NN(物品数量,N<=30N<=30);
第2..N+12..N+1行:每行二个整数Wi,CiWi,Ci,表示每个物品的重量和价值。
【输出】
仅一行,一个数,表示最大总价值。
【输入样例】
10 4 2 1 3 3 4 5 7 9
【输出样例】
12
#include<stdio.h> int dp[200]; int w[50], v[50]; int max(int a, int b) { if (a > b) return a; else return b; } int main() { int m, n; scanf("%d%d", &m, &n); for (int i = 1; i <= n; i++) { scanf("%d%d", &w[i], &v[i]); } for (int i = 1; i <= n; i++) { for (int j = m; j >= 1; j--)//必须要逆序 { if (w[i] <= j) { dp[j] = max(dp[j], dp[j - w[i]] + v[i]); } } } printf("%d", dp[m]); return 0; }
完全背包问题
题目描述】
设有nn种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为MM,今从nn种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于MM,而价值的和为最大。
【输入】
第一行:两个整数,MM(背包容量,M≤200M≤200)和NN(物品数量,N≤30N≤30);
第2..N+12..N+1行:每行二个整数Wi,CiWi,Ci,表示每个物品的重量和价值。
【输出】
仅一行,一个数,表示最大总价值。
【输入样例】
10 4 2 1 3 3 4 5 7 9
【输出样例】
max=12
#include<stdio.h> int dp[200]; int w[50], v[50]; int max(int a, int b) { if (a > b) return a; else return b; } int main() { int m, n; scanf("%d%d", &m, &n); for (int i = 1; i <= n; i++) { scanf("%d%d", &w[i], &v[i]); } for (int i = 1; i <= n; i++) { for (int j = w[i]; j <= m; j++) { dp[j] = max(dp[j], dp[j - w[i]] + v[i]); } } printf("max=%d", dp[m]); return 0; }
多重背包问题
【题目描述】
为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员。期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力。
【输入】
第一行二个数n(n≤500)n(n≤500),m(m≤6000)m(m≤6000),其中nn代表希望购买的奖品的种数,mm表示拨款金额。
接下来nn行,每行33个数,vv、ww、ss,分别表示第I种奖品的价格、价值(价格与价值是不同的概念)和能购买的最大数量(买00件到ss件均可),其中v≤100v≤100,w≤1000w≤1000,s≤10s≤10。
【输出】
一行:一个数,表示此次购买能获得的最大的价值(注意!不是价格)。
【输入样例】
5 1000 80 20 4 40 50 9 30 50 7 40 30 6 20 20 1
【输出样例】
1040
复制代码到粘帖板 #include<stdio.h> int dp[6100], v[510], w[510], s[510]; int max(int a, int b) { if (a > b) return a; else return b; } int main() { int m, n; scanf("%d%d", &m, &n); for (int i = 1; i <= m; i++) { scanf("%d%d%d", &w[i], &v[i], &s[i]); } for (int i = 1; i <= m; i++) { for (int j = n; j >= 1; j--) { for (int k = 0; k <= s[i] && k * w[i] <= j; k++) { dp[j] = max(dp[j], dp[j - k * w[i]] + k * v[i]); } } } printf("%d", dp[n]); return 0; }
今天的文章C语言背包问题_01背包问题c++实现「建议收藏」分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/70084.html