您的位置:首页 > 其它

小A点菜 水题 dp 背包

2016-11-08 11:20 246 查看
基本上还是01背包,首先注意必须正好花光钱,所以初始化时除了dp[0]以外其他都要设置成inf,然后因为求方案数,所以基本方程为dp[i] = dp[i-x] + dp[i],再根据inf进行一些特殊处理即得解

1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4
5 const int maxm = 10000 + 500;
6 const int inf = 0x7fffffff >> 1;
7 int dp[maxm];
8 int n, m;
9 int x;
10
11 int main () {
12     scanf("%d %d", &n, &m);
13     for (int i = 1; i <= m; i++) dp[i] = inf;
14     dp[0] = 1;
15     for (int i = 1; i <= n; i++) {
16         scanf("%d", &x);
17         for (int j = m; j >= x; j--) {
18             if (dp[j - x] == inf) continue;
19             if (dp[j] == inf) dp[j] = dp[j-x];
20             else dp[j] += dp[j-x];
21         }
22     }
23     if (dp[m] == inf) printf("0");
24     else printf("%d", dp[m]);
25     return 0;
26 }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: