C语言背包问题
0/1背包問題
一個旅行者有一個最多能裝?MM?公斤的背包,現(xiàn)在有?nn?件物品,它們的重量分別是W1,W2,...,WnW1,W2,...,Wn,它們的價值分別為C1,C2,...,CnC1,C2,...,Cn,求旅行者能獲得最大總價值。
【輸入】
第一行:兩個整數(shù),MM(背包容量,M<=200M<=200)和NN(物品數(shù)量,N<=30N<=30);
第2..N+12..N+1行:每行二個整數(shù)Wi,CiWi,Ci,表示每個物品的重量和價值。
【輸出】
僅一行,一個數(shù),表示最大總價值。
【輸入樣例】
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;elsereturn 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; }完全背包問題
題目描述】
設(shè)有nn種物品,每種物品有一個重量及一個價值。但每種物品的數(shù)量是無限的,同時有一個背包,最大載重量為MM,今從nn種物品中選取若干件(同一種物品可以多次選取),使其重量的和小于等于MM,而價值的和為最大。
【輸入】
第一行:兩個整數(shù),MM(背包容量,M≤200M≤200)和NN(物品數(shù)量,N≤30N≤30);
第2..N+12..N+1行:每行二個整數(shù)Wi,CiWi,Ci,表示每個物品的重量和價值。
【輸出】
僅一行,一個數(shù),表示最大總價值。
【輸入樣例】
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;elsereturn 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; }多重背包問題
【題目描述】
為了慶賀班級在校運(yùn)動會上取得全校第一名成績,班主任決定開一場慶功會,為此撥款購買獎品犒勞運(yùn)動員。期望撥款金額能購買最大價值的獎品,可以補(bǔ)充他們的精力和體力。
【輸入】
第一行二個數(shù)n(n≤500)n(n≤500),m(m≤6000)m(m≤6000),其中nn代表希望購買的獎品的種數(shù),mm表示撥款金額。
接下來nn行,每行33個數(shù),vv、ww、ss,分別表示第I種獎品的價格、價值(價格與價值是不同的概念)和能購買的最大數(shù)量(買00件到ss件均可),其中v≤100v≤100,w≤1000w≤1000,s≤10s≤10。
【輸出】
一行:一個數(shù),表示此次購買能獲得的最大的價值(注意!不是價格)。
【輸入樣例】
5 1000 80 20 4 40 50 9 30 50 7 40 30 6 20 20 1【輸出樣例】
1040 復(fù)制代碼到粘帖板 #include<stdio.h> int dp[6100], v[510], w[510], s[510]; int max(int a, int b) {if (a > b)return a;elsereturn 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; }總結(jié)
- 上一篇: mybatis学习(28):获取自增id
- 下一篇: java properties nati