lrj 9.2.3

int INF = -(1<<30);

// 记忆化搜索
min[0]  = 0;
int dp(int i) {
    if(maxv[i] != -1)
        return maxv[i];
    maxv[i] = -INF;
    for(int j = 1; j <= n; j++)
        if(i >= V[j])
            maxv[i] = max(maxv[i], dp(i-V[j]) + 1);
    return maxv[i];
}

printf("%d\n", dp[S]);

// 递推
maxv[0]  = 0;
for(int i = 1; i <= S; i++) {
    maxv[i] = -INF;
}
for(int i = 1; i <= S; i++)
    for(int j = 1; j <= n; j++)
        if(i >= V[j])
            maxv[i] = max(maxv[i], maxv[i-V[j]] + 1);
            // 上面这条语句相当于
            //if(maxv[i] < maxv[i-V[j]] + 1) {
            //    maxv[i] = maxv[i-V[j]] + 1;
            }

printf("%d\n", maxv[S]);

void print_ans(int* maxv, int S) {
    for(int j = 1; j <= n; j++)
        if(S >= V[j] && maxv[S] == maxv[S-V[j]] + 1) {
            printf("%d ", j);
            print_ans(maxv, S-V[j]);
            break;
        }
}

// 递推 2
maxv[0]  = 0;
for(int i = 1; i <= S; i++) {
    maxv[i] = -INF;
}
for(int i = 1; i <= S; i++)
    for(int j = 1; j <= n; j++)
        if(i >= V[j]) {
            if(maxv[i] < maxv[i-V[j]] + 1) {
                maxv[i] = maxv[i-V[j]] + 1;
                max_coin[i] = j;
            }
        }

void print_ans(int* max_coin, int S) {
    while(S) {
        printf("%d ", max_coin[S]);
        S -= V[max_coin[S]];
    }
}
时间: 2024-08-25 14:06:13

lrj 9.2.3的相关文章

lrj计算几何模板

整理了一下大白书上的计算几何模板. 1 #include <cstdio> 2 #include <algorithm> 3 #include <cmath> 4 using namespace std; 5 //lrj计算几何模板 6 struct Point 7 { 8 double x, y; 9 Point(double x=0, double y=0) :x(x),y(y) {} 10 }; 11 typedef Point Vector; 12 const

// 62.是否有利润奖--lrj private boolean isProfitsAward; // 63.利润奖--lrj_price private String profitsAward;

// 62.是否有利润奖--lrj private boolean isProfitsAward; // 63.利润奖--lrj_price private String profitsAward; 如果 这二个名称相同(profitsAward,isProfitsAward),报错,getIs,setIs public boolean getIsProfitsAward() { return isProfitsAward; } public void setIsProfitsAward(boo

C++语言学习——LRJ入门经典笔记

1.scanf的输入格式,空格.TAB和回车符都是无关紧要,所以按Enter键并不意味着输入结束. 告诉程序输入结束的方式: 在windows下,输入完毕后先按Enter键,再按Ctrl+Z键,最后再按Enter键. 在linux下,输入完毕后按Ctrl+D键 2.gcc 编译选项 -Wall指出警告 -ansi 判断是否和ANSI冲突 -pedantic 比ansi更加严格 -lm 链接数学库, C++编译器会自动链接 -DDEBUG 编译时定义符号DEBUG,可以换成其它,如-DLOCAL将

lrj紫书第五章

UVA-1592 1 // UVa1592 Database 2 // Rujia Liu 3 // 本程序只是为了演示STL各种用法,效率较低.实践中一般用C字符串和哈希表来实现. 4 5 #include<iostream> 6 #include<cstdio> 7 #include<vector> 8 #include<string> 9 #include<map> 10 #include<sstream> 11 using n

Uva 122 树的层次遍历 Trees on the level lrj白书 p149

是否可以把树上结点的编号,然后把二叉树存储在数组中呢?很遗憾如果结点在一条链上,那将是2^256个结点 所以需要采用动态结构 首先要读取结点,建立二叉树addnode()+read_input()承担这样的工作 然后遍历二叉树,读取结点编号输出bfs() 这道题有内存池应用的背景 附链接  http://blog.csdn.net/shawngucas/article/details/6574863 #include <cstdio> #include <cstring> #inc

LRJ

//3-1 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <cstdio> 4 5 int main() 6 { 7 int T; 8 char score[85]; 9 scanf("%d", &T); 10 while (T-- > 0) { 11 scanf("%s", score); 12 int sum = 0; 13 int num = 1; 14 char prev = 'X';

【枚举】【lrj黑书】奇怪的问题(古老的智力题)

题目描述: 请回答下面的 10 个问题,你的回答应保证每题惟有你的选择是正确的. ⑴ 第一个答案是b 的问题是哪一个?(a )2 ( b ) 3 ( c ) 4 ( d ) 5 ( e ) 6⑵ 恰好有两个连续问题的答案是一样的,它们是:( a ) 2 , 3 ( b ) 3, 4 ( c ) 4 ,5 ( d ) 5 ,6 ( e ) 6 ,7 ⑶ 本问题答案和哪一个问题的答案相同?( a ) 1 ( b ) 2 ( c ) 4 ( d ) 7 ( e ) 6⑷ 答案是a 的问题的个数是:(

lrj 9.4.1 最长上升子序列 LIS

p275 d(i)是以Ai为结尾的最长上升子序列的长度 <算法竞赛入门经典-训练指南>p62 问题6 提供了一种优化到 O(nlogn)的方法. 在O(nlogn)的算法分析中(从“假设已经计算出的两个状态...”开始), 用g(i)表示d值为i的最小状态编号,状态编号就是数组下标 g(1) <= g(2) <= g(3) <= ... <= g(n) 可以用反证法: 假设 i < j, g(i) > g(j) g(j)代表 d(x) = j 的最小 x,对

LRJ 3-7

#define _CRT_SECURE_NO_WARNINGS #include <cstdio> int main() { int T; int m, n; char dna[55][1005]; // 4 <= m <= 50, 4 <= n <= 1000 scanf("%d", &T); while (T--) { scanf("%d%d", &m, &n); for (int i = 0; i &