zoukankan      html  css  js  c++  java
  • 统计硬币 HDU 2566 (三种解法:线性代数解法,背包解法,奇思妙想解法 >_< )

    题号放这里自己去找吧。

    HDU-2566

    这题最开始用的dp,然后,被同学用奇思妙想过了。  >_<  开心!

    -_- !! 然后,被我线性代数给过了。

    方法一:dp

    将其化为01背包,只不过每种物品可以重复取的各数和为n就行。

    好了,代码如下:

    #include<iostream>
    #include<cstring>
    using namespace std;
    int dp[1001][1001];
    int w[]={0,1,2,5};
    int main()
    {
        int k, n, v;
        cin>>k;
        while(k--)
        {
            memset(dp, 0,sizeof(dp));
            cin>>n>>v;
            dp[0][0]=1;
            for(int i=1;i<=3;i++)
            {
                for(int k=1;k<=n;k++)
                    for(int j=w[i]; j<=v;j++)
                    dp[k][j]+=dp[k-1][j-w[i]];
            }
            cout<<dp[n][v]<<endl;
        }
    }

    哎呀,背包都差不多忘了。得复习了。

    方法二:

    因为 2 2 2 2 可以转化为 1 1 1 5啊;也就是说找最多的2的方案,当然余出来的1是不可组的。当然,最多2的情况来转化1115的情况

    #include<cstdio>
    
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            int n, m;
            int a=0,b=0,c=0;
            scanf("%d%d",&n,&m);
            for(int i=0;i<=n;i++){
                for(int j=0;j+i<=n;j++){
                    if(j*2+i+(n-j-i)*5 == m){
                        b = j;
                        i = n;
                        break;
                    }
                }
            }
            printf("%d\n",1+b/4);
        }
        return 0;
    }

    感觉这个方法,我也不是很清楚。可能没说明白。

    方法三:

    设a , b, c分别是1元 2元 5元的个数,那么也就是a+b+c=n和a+2*b+5*c=m这样就构成了一个矩阵方程。直接解开这个矩阵方程就行啦。

    当然,还有更加明白的解释方法。一只3个未知数和两个约数条件,那么我们可以利用高中学过的消元,用一个未知数表示其他两个未知数。

    即得到b = -4 * c + m - n;
               a = 3 * c+ 2 * n - m;这两个公式,然后直接枚举c就可以了,注意的是,a+b+c=n一定是成立的。但是,由于数学公式要满足实际问题的需要

    我们只能取a, b大于等于0的情况。

     1 #include<cstdio>
     2 
     3 int main()
     4 {
     5     int t;
     6     scanf("%d", &t);
     7     while (t--)
     8     {
     9         int n, m;
    10         scanf("%d%d", &n, &m);
    11         int a, b, c = 0;
    12         int ans = 0;
    13         while (1)
    14         {
    15             b = -4 * c + m - n;
    16             a = 3 * c+ 2 * n - m;
    17             if (b>=0&&a>=0)ans++;
    18             else if (b < 0) break;
    19             c++;
    20         }
    21         printf("%d\n", ans);
    22     }
    23     return 0;
    24 }
  • 相关阅读:
    POJ 3710 Christmas Game#经典图SG博弈
    POJ 2599 A funny game#树形SG(DFS实现)
    POJ 2425 A Chess Game#树形SG
    LeetCode Array Easy 122. Best Time to Buy and Sell Stock II
    LeetCode Array Easy121. Best Time to Buy and Sell Stock
    LeetCode Array Easy 119. Pascal's Triangle II
    LeetCode Array Easy 118. Pascal's Triangle
    LeetCode Array Easy 88. Merge Sorted Array
    ASP.NET MVC 学习笔记之 MVC + EF中的EO DTO ViewModel
    ASP.NET MVC 学习笔记之面向切面编程与过滤器
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9479298.html
Copyright © 2011-2022 走看看