标签:
1. 01背包
问题描述:
小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need(i)张奖券进行兑换,同时也只能兑换一次。为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其中第i件奖品的评分值为value(i),表示他对这件奖品的喜好值。现在他想知道,凭借他手上的这些奖券,可以换到哪些奖品,使得这些奖品的喜好值之和能够最大。
1 #include<stdio.h> 2 #include<string.h> 3 #define M 100005 4 int V[M]; 5 6 int main() 7 { 8 int n, m, need, value, i, j; 9 scanf("%d%d", &n, &m); 10 for (i = 0; i < n; i++) 11 { 12 scanf("%d%d", &need, &value); 13 for (j = m; j >= need; j--) //逆向 14 { 15 if (V[j - need] + value>V[j]) 16 V[j] = V[j - need] + value; 17 } 18 } 19 printf("%d\n", V[m]); 20 return 0; 21 }
2. 完全背包
问题描述:
小Ho现在手上有M张奖券,而奖品区有N种奖品,分别标号为1到N,其中第i种奖品需要need(i)张奖券进行兑换,并且可以兑换无数次,为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其中第i件奖品的评分值为value(i),表示他对这件奖品的喜好值。现在他想知道,凭借他手上的这些奖券,可以换到哪些奖品,使得这些奖品的喜好值之和能够最大。
#include<stdio.h> #include<string.h> #define M 100005 int V[M]; int main() { int n, m, need, value, i, j; scanf("%d%d", &n, &m); for (i = 0; i < n; i++) { scanf("%d%d", &need, &value); for (j = need; j <=m; j++) //正向 { if (V[j - need] + value>V[j]) V[j] = V[j - need] + value; } } printf("%d\n", V[m]); return 0; }
标签:
原文地址:http://www.cnblogs.com/argenbarbie/p/4835531.html