动态规划之神奇的口袋(百练2755)

来源:互联网 发布:吉他初学者 知乎 编辑:程序博客网 时间:2024/04/29 08:00

描述:NULL
方法1) 递归

#include<iostream>using namespace std;int a[30];int N;int Ways(int w, int k) {//从前k种物品中选择一些,凑成体积w的做法数目    if (w == 0) return 1;    if (k <= 0) return 0;    return Ways(w, k - 1) + Ways(w - a[k], k - 1);}int main(){    cin >> N;    for (int i = 1; i <= N; ++i)        cin >> a[i];    cout << Ways(40, N);    return 0;}

方法2)动归

#include<iostream>using namespace std;int a[30];int N;int Ways[40][30];int main(){    cin >> N;    memset(Ways, 0, sizeof(Ways));    for (int i = 1; i <= N; ++i) {        cin >> a[i];        Ways[0][i] = 1;    }    Ways[0][0] = 1;    for (int w = 1; w <= 11; ++w) {        for (int k = 1; k <= N; ++k) {            Ways[w][k] = Ways[w][k - 1];            if (w - a[k] >= 0)                Ways[w][k] += Ways[w - a[k]][k - 1];        }    }    cout << Ways[11][N];    return 0;}
0 0