7.6 MCodeForces 687CThe Values You Can Make

来源:互联网 发布:淘宝推广赚佣金 编辑:程序博客网 时间:2024/05/18 03:44

题意:

给你n个面值不同的硬币,问买下价值为k的巧克力后,剩下的硬币价值有多少种情况,并列举出来。

思路:

用动态规划。

代码:

#include <iostream>#include <vector>using namespace std;bool dp[501][501][501];//表示在第i个数时,和为j时,能否构造出kvector<int> vi;int main(){    ios::sync_with_stdio(0);    int n,k;    cin>>n>>k;    dp[0][0][0]=1;    for(int i=1;i<=n;i++){        int c;        cin>>c;        for(int j=0;j<=k;j++)        for(int p=0;p<=j;p++){            dp[i][j][p] |=dp[i-1][j][p];//第i个数未算入和中            if(j>=c) dp[i][j][p] |= dp[i-1][j-c][p];//第i个数算入和中,但不参与构造p            if(p>=c) dp[i][j][p] |= dp[i-1][j-c][p-c];//第i个数算入和中,参与构造p        }    }    for(int i=0;i<=k;i++)if(dp[n][k][i]){        vi.push_back(i);    }    cout<<vi.size()<<endl;    for(int i=0;i<vi.size();i++){        if(i!=vi.size()-1)cout<<vi[i]<<' ';        else cout<<vi[i]<<endl;    }    return 0;}

0 0
原创粉丝点击