【UVa】10819 - Trouble of 13-Dots

23 篇文章 0 订阅

Problem here

Problem

Do you know 13-Dots? She is the main character of a well-known Hong Kong comic series. She is
famous of her beauty, as well as the variety of stylish clothes she wears. Now 13-Dots is facing a problem. She used to have a large amount of pocket money every month.
However, her father has decided to cut down her budget of buying new clothes! In the past, she would
buy every dress she liked without hesitation, but now she needs careful consideration before making
any purchase. Every month, she prepares a list containing the prices and ’favour indices’ (ranging from
1 to 5) of all items she is interested. At the end of the month, she would decide how to spend her
money such that the total favour value is maximized. It is important to know that 13-Dots always uses
her credit card to pay the bill, which offers her a 200-dollar refund if her total expense in the month
exceeds 2000.Forexample,ifherbudgetis 5000, she can buy clothes with total marked price of at
most 5200 dollars.
Since the optimal way is hard to be figured out just by hand, can you write a program for 13-Dots
that helps her make the decision? Remember that you should NEVER select an item more than once,
even if this leads to a greater total favour value.

INPUT

The input consists of several test cases. Each of them has the following format:
The first line gives two integers, m and n (0 ≤ m ≤ 10000, 0 ≤ n ≤ 100), which are the amount of
pocket money 13-Dots has and the number of items on the list respectively. The following n lines each
contains two integers, p and f (0 < p ≤ 4000, 1 ≤ f ≤ 5), where p is the marked price of the item, and
f is its ‘favour index’.
Input is terminated by EOF.

OUTPUT

For each test case, print one line giving the maximum total favour value 13-Dots can get.

SAMPLE

input

500 4
100 2
100 3
200 3
400 4

output

8

Solution

#include <iostream>
#include "memory.h"
using namespace std;
int p[4001], f[4001];
int dp[110][11000];
int n, m;

int sf(int i, int w){
    if(w > m && m <= 1800)
        return -1000;

    if(w > m+200)
        return -1000;

    if(i == n){
        if(w > m && w <= 2000)
            return -1000;

        return 0;
    }

    if(dp[i][w] != -1){
        return dp[i][w];
    }

    return dp[i][w] = max(sf(i+1, w), sf(i+1, w+p[i]) + f[i]);
}

int main(){

    while(cin >> m >> n){
        memset(p, 0, sizeof(p));
        memset(f, 0, sizeof(f));
        memset(dp, -1, sizeof(dp));
        for(int i = 0; i < n; i++){
            int ip, fi;
            cin >> ip >> fi;
            p[i] = ip;
            f[i] = fi;
        }
        cout << sf(0, 0) << endl;

    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值