表示实现凑价格 最少需要几张优惠券,那么 就是要求的结果。
对于每张优惠券。都遍历一遍 。看一下加上这张优惠券能不能有更好的效果。

#include<iostream>

using namespace std;

const int INF = 0x3f3f3f3f;
int main()
{
    int P;
    int dp[10010]={0};
    while(cin >> P && P!=0)
    {
        int N;
        cin >> N;
        int v;
        for(int i = 0 ; i <= P ; i++)
        {
            dp[i]=INF;
        }
        for(int i = 0 ; i < N ; i++)
        {
            cin >>v;
            dp[v] = 1;//有价值为v的优惠券,那么v的价格就可以用一张优惠券拼成 这个一定是最优的方案
            for(int i = v+1 ; i <= P ; i++)
            {
                if(dp[i-v]!=INF)//如果i-v有方案那说明i的价格可以从i-v加一张价值为v的优惠券拼成
                {
                    dp[i]=min(dp[i],dp[i-v]+1); //看一下可不可以更优
                }
            }
        }
        if(dp[P]==INF)
        {
            cout<<"Impossible"<<endl;
        }
        else{
            cout<<dp[P]<<endl;
        }
    }
    return 0;
}