您的位置:首页 > 其它

背包问题

2015-09-24 15:42 232 查看
1. 01背包

问题描述:

小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 = m; j >= need; j--)  //逆向
         {
if (V[j - need] + value>V[j])
V[j] = V[j - need] + value;
}
}
printf("%d\n", V[m]);
return 0;
}


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: