21-找快乐(背包)

/*题目内容:

没有买到奥运会的门票让YF伤心不已,为了使自己开心起来,他去找周围的人聊天,每找一个人聊天,他就会耗费一定的体力,但他会得到一定量的快乐。YF试图使自己尽可能的高兴,但一旦体力耗尽了(为零或为负),他也就挂了,就一点快乐都没有了。现在Yk初始有100点体力,他最多可以获得多少快乐?

输入描述

数据分多组,对于每组数据:第一行为n,表示有YK的n(0<n<21)个朋友。第二行表示和每个人聊天耗费的体力,第三行表示每个人所能提供的快乐值。输入以一个0结束。

输出描述

对于每组输出,输出一个值,YK可以获得的最大的快乐值。


输入样例


3
1 21 79
20 30 25
4
100 100 100 100
1 2 3 4
0

输出样例
50
0
*/

#include <iostream>
#include <cstring>
using namespace std;

int main(){
    int s = 99.999, f[100], w[100], v[100];
    int n;
    while(cin >> n){
        if(n == 0)
            return 1;
        memset(f, 0, sizeof(f));
        memset(w, 0, sizeof(w));
        memset(v, 0, sizeof(v));
        for(int i = 0; i < n; i++)
            cin >> w[i];
        for(int i = 0; i < n; i++)
            cin >> v[i];
        for(int i = 0; i < n; i++){
            for(int j = s; j > w[i]; j--)
                f[j] = max(f[j - w[i]] + v[i], f[j]);
        }
        cout << f[s] << endl;
    }
    
    return 0;
}

原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7429763.html