• 【DP复习】背包 ovo


    水题10s切得pj-的那种QAQ

     P1048 采药  (01)

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 const int sz = 1010;
     5 int dp[sz], val[sz], tim[sz];
     6 int t, m;
     7 int main() {
     8     scanf("%d%d", &t, &m);
     9     for(int i = 1; i <= m; i++) 
    10         scanf("%d%d", &tim[i], &val[i]);
    11     for(int i = 1; i <= m; i++) {
    12         for(int j = t; j >= 0; j--) {
    13             if(j >= tim[i])
    14                 dp[j] = max(dp[j - tim[i]] + val[i], dp[j]);
    15         }
    16     }
    17     printf("%d", dp[t]);
    18     return 0;
    19 }

     P1049 装箱问题  (01)

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 const int sz = 20020;
     5 int n, m, use[sz], dp[sz];
     6 int main() {
     7     scanf("%d%d", &m, &n);
     8     for(int i = 1; i <= n; i++) 
     9         scanf("%d", &use[i]);
    10     for(int i = 1; i <= n; i++) {
    11         for(int j = m; j >= 0; j--) {
    12             if(j >= use[i])
    13                 dp[j] = max(dp[j - use[i]] + use[i], dp[j]);
    14         }
    15     }
    16     printf("%d",m - dp[m]);
    17     return 0;
    18 }

     P1060 开心的金明  (01)

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 const int sz = 30030;
     5 int dp[sz], val[sz], mon[sz];
     6 int n, m;
     7 int main() {
     8     scanf("%d%d", &m, &n);
     9     for(int i = 1; i <= n; i++) 
    10         scanf("%d%d", &mon[i], &val[i]);
    11     for(int i = 1; i <= n; i++) {
    12         for(int j = m; j >= 0; j--) {
    13             if(j >= mon[i]) 
    14                 dp[j] = max(dp[j - mon[i]] + val[i] * mon[i], dp[j]);
    15         }
    16     }
    17     printf("%d", dp[m]);
    18     return 0;
    19 }

     P1616 疯狂的采药  (完全)

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 const int maxt = 100010, maxm = 10010;
     5 int n, m, dp[maxt], val[maxm], tim[maxm];
     6 int main() {
     7     scanf("%d%d", &m, &n);
     8     for(int i = 1; i <= n; i++)
     9         scanf("%d%d", &tim[i], &val[i]);
    10     for(int i = 1; i <= n; i++) {
    11         for(int j = 1; j <= m; j++) {
    12             if(j >= tim[i]) 
    13                 dp[j] = max(dp[j - tim[i]] + val[i], dp[j]);
    14         }
    15     }
    16     printf("%d", dp[m]);
    17     return 0;
    18 }

     P2722 总分 Score Inflation (完全/usaco)

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 const int sz = 10010;
     5 int n, m, dp[sz], val[sz], tim[sz];
     6 int main() {
     7     scanf("%d%d", &m, &n);
     8     for(int i = 1; i <= n; i++) {
     9         scanf("%d%d", &val[i], &tim[i]);
    10         for(int j = 1; j <= m; j++) {
    11             if(j >= tim[i])
    12                 dp[j] = max(dp[j - tim[i]] + val[i], dp[j]);
    13         }
    14     }
    15     printf("%d", dp[m]);
    16     return 0;
    17 }

    P2347 砝码称重 (01背包求方案数)

    dp[j] 剩余体积为j时的方案数 

    不选dp[j] = dp[j] 选 dp[j] = dp[j - f[i]]

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int num[7] = {0, 1, 2, 3, 5, 10, 20};
     5 int dp[1010], f[1010], k, cnt = 0, ans = 0, m;
     6 int main() {
     7     for(int i = 1; i <= 6; i++) {
     8         scanf("%d", &k);
     9         for(int j = 1; j <= k; j++)
    10             f[++cnt] = num[i], m += f[cnt];
    11     }
    12     dp[0] = 1;
    13     for(int i = 1; i <= cnt; i++) 
    14         for(int j = m; j >= 0; j--) 
    15             if(j >= f[i]) dp[j] = dp[j] + dp[j - f[i]];
    16     for(int i = 1; i <= m; i++) if(dp[i]) ans++;//是ans++不是 ans += dp[i] 因为不能算重复的qwq 
    17     printf("Total=%d", ans);
    18     return 0;
    19 }

     P1164 小A点菜 (01 背包求方案数)

    和上一个题区别, 上一题要求输出总共多少种方案, 不需要用尽空间, 这一题需要将空间用尽, 所以 dp[m]即答案

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 const int maxn = 110, maxm = 10010;
     5 int n, m;
     6 int dp[maxm], p[maxn];
     7 int main() {
     8     scanf("%d%d", &n, &m);
     9     for(int i = 1; i <= n; i++) 
    10         scanf("%d", &p[i]);
    11     dp[0] = 1;
    12     for(int i = 1; i <= n; i++) 
    13         for(int j = m; j >= p[i]; j--)
    14             dp[j] = dp[j] + dp[j - p[i]];
    15     printf("%d", dp[m]);
    16     return 0; 
    17 } 
  • 相关阅读:
    coredump分析
    Sword LRU算法
    C++ STL迭代器失效问题
    Sword DB主从一致性的解决方法
    Sword CRC算法原理
    C语言 按位异或实现加法
    Linux 等待信号(sigsuspend)
    C语言 宏定义之可变参数
    Linux shell字符串操作
    C++ *和&
  • 原文地址:https://www.cnblogs.com/Hwjia/p/9873094.html
Copyright © 2020-2023  润新知