标签:style blog http color os io 数据 for
1 int goldGet(int People, int mineNum)
2 {
3 if(mineNum == 0)
4 {
5 /*考虑最后一座金矿是,如果剩余开采金矿的总人数
6 多余或者等于需要的人数,则返回该金矿的金子数
7 目,否则返回0。*/
8 if(People >= PeopleNeeded[mineNum])
9 {
10 return Gold[mineNum];
11 }
12 else
13 {
14 return 0;
15 }
16 }
17 else
18 {
19 int m, n;
20 /*考虑第mineNum座金矿,第一种情况:开采该座金矿所能获得的最多的金子数目,
21 为该座金矿的金子数目和剩下的人开采剩下的金矿所得到的最多的金子数目的和
22 第二种情况:部开采该座金矿所获得的最多的金子数目,是目前所有的人用来开
23 采剩余的金矿获得的最多的金子数目。返回两种情况下金子数目较多的一种情况
24 的金子数目。*/
25 if(People >= PeopleNeeded[mineNum])
26 {
27 m = Gold[mineNum] + goldGet(People - PeopleNeeded[mineNum], mineNum - 1);
28 }
29 else
30 {
31 m = goldGet(People, mineNum - 1);
32 }
33 n = goldGet(People, mineNum - 1);
34
35 return m >= n ? m : n;
36 }
37 }
#include <stdio.h>
#include <stdlib.h>
#define MaxNum 500
int PeopleNeeded[MaxNum]; //PeopleNeeded[i]表示第i座金矿需要的开采人数
int Gold[MaxNum]; //Gold[i]表示第i座金矿开采后得到的金子数目
int goldGet(int People, int mineNum)
{
if(mineNum == 0)
{
/*考虑最后一座金矿是,如果剩余开采金矿的总人数
多余或者等于需要的人数,则返回该金矿的金子数
目,否则返回0。*/
if(People >= PeopleNeeded[mineNum])
{
return Gold[mineNum];
}
else
{
return 0;
}
}
else
{
int m, n;
/*考虑第mineNum座金矿,第一种情况:开采该座金矿所能获得的最多的金子数目,
为该座金矿的金子数目和剩下的人开采剩下的金矿所得到的最多的金子数目的和
第二种情况:部开采该座金矿所获得的最多的金子数目,是目前所有的人用来开
采剩余的金矿获得的最多的金子数目。返回两种情况下金子数目较多的一种情况
的金子数目。*/
if(People >= PeopleNeeded[mineNum])
{
m = Gold[mineNum] + goldGet(People - PeopleNeeded[mineNum], mineNum - 1);
}
else
{
m = goldGet(People, mineNum - 1);
}
n = goldGet(People, mineNum - 1);
return m >= n ? m : n;
}
}
int main()
{
int People; //开采金矿的总人数
int GoldNum; //金矿数目
int GoldGet; //最终能够获取的金子的总数
int i, j; //用来进行的便利的变量
scanf("%d %d", &GoldNum, &People);
for(i = 0; i < GoldNum; i ++)
{
scanf("%d %d", &PeopleNeeded[i], &Gold[i]);
}
GoldGet = goldGet(People, GoldNum);
printf("%d\n", GoldGet);
return 0;
}
/*01背包问题*/
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int max(int x, int y)
{
return x >=y ? x : y;
}
int main()
{
int N; //表示奖品的个数
int M; //表示奖券数
int need[500]; //need[i]表示第i个奖品需要的奖券数
int value[500]; //value[i]表示第i个奖品的评分值
int best[100000]; //best[j]表示对于i个奖品时j张奖券的最大评分值
memset(best, 0, sizeof(best)); //初始化best的所有元素为0
int i, j; //程序进行遍历的变量
scanf("%d %d", &N, &M);
for(i = 0; i < N; i ++)
{
scanf("%d %d", &need[i], &value[i]);
}
for(i = 0; i < N; i ++)
{
for(j = M - 1; j >= need[i]; j --)
{
best[j] = max(best[j], best[j - need[i]] + value[i]);
}
}
printf("%d\n", best[M - 1]);
return 0;
}
for(i = N- 1; i > 0; i --)
{
for(j = M - 1; j >= need[i]; j --)
{
best[i, j] = max(best[i - 1][ j], best[i - 1][j - need[i]] + value[i]);
}
}
for(i = 0; i < N; i ++)
{
for(j = M - 1; j >= need[i]; j --)
{
best[j] = max(best[j], best[j - need[i]] + value[i]);
}
}
标签:style blog http color os io 数据 for
原文地址:http://www.cnblogs.com/mumushu/p/3923147.html