UVa 10465 - Homer Simpson(背包&贪心)

/**
*  这题第一思路就是贪心,还是因为dp题做的少。  这题也是很明显的完全背包问题
*  不过对于这题贪心的效率更高吧。
*  思路: 令 m > n , 枚举n的个数的所有可能 0 到 sizeOfN。
*  因为这样枚举的话,能够使得先得到的一定比后得到的所选取的个数大。
*  然后用一个数组remain[10001]存drink beer的时间的各种情况所能够吃的最多的汉堡数。
*  最后输出的时候就是按i = 0 - t遍历remain[i].
*/

#include <cstdio>
#include <cstring>
#include <cmath>
#include <stack>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
#define INF 0x7fffffff
using namespace std;
int n, m, t, remain[10001];
int ans, minRe;
void solve() {
    int cur, sizeOfN = t / n;
    memset(remain, 0, sizeof(remain));
    minRe = INF;
    for(int i = 0; i <= sizeOfN; i ++) {
        cur = t - i * n;
        if(cur % m < minRe) {
            minRe = cur % m;
            if(cur / m + i > remain[minRe])
                remain[minRe] = cur / m + i;
            if(remain[0]) break;
        }
    }

    if(remain[0]) {
        printf("%d\n", remain[0]);
        return ;
    }

    for(int i = 1; i <= 10000; i ++) {
        if(remain[i]) {
            printf("%d %d\n", remain[i], i);
            return ;
        }
    }
    printf("0 %d\n", t);
}

int main()
{
    while(scanf("%d%d%d", &m, &n, &t) != EOF) {
        if(m > n)   swap(m, n);
        ans = 0;
        solve();
    }
    return 0;
}


 

 

dp:

直接贴人代码吧: - -

 

# include <stdio.h>
 # include <memory.h>
 
 # define MAX(x,y) ((x)>(y) ? (x):(y))
 
 # define INF (1<<30)
 
 int c[2];
 int f[10001];
 
 int main()
 {
     int t, i, v;
         
     while (~scanf("%d%d%d", &c[0], &c[1], &t))
     {
         f[0] = 0; 
         for (i = 1; i <= 10000; ++i) f[i] = -INF;
         
         for ( i = 0; i <= 1; ++i)
         for ( v = c[i]; v <= t; ++v)
             f[v] = MAX(f[v], f[v-c[i]]+1);
            
            v = t;
            while ( f[v] < 0) --v;
                 
         printf("%d", f[v]);     
         if (v != t) printf(" %d", t-v);
         putchar('\n');
     }
     
     return 0;
 }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值