码迷,mamicode.com
首页 > 其他好文 > 详细

背包问题

时间:2015-09-24 16:19:31      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!