标签:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <vector> #include <map> #include <algorithm> using namespace std; const int N = 550; const int INF = 0x3fffffff; const long long MOD = 1000000007; typedef long long LL; #define met(a,b) (memset(a,b,sizeof(a))) int a[40]; int dp[40][N]; /// dp[k][j] 代表选 k 个物品,其中价值为 j 的物品的组合数 int main() { int T; scanf("%d", &T); while(T--) { int i, j, k, n, m, Max=0; scanf("%d%d", &n, &m); met(a, 0); met(dp, 0); for(i=1; i<=n; i++) scanf("%d", &a[i]); dp[0][0] = 1; for(i=1; i<=n; i++) { for(k=i; k>=1; k--) { for(j=a[i]; j<=m; j++) { dp[k][j] += dp[k-1][j-a[i]]; if(dp[k][j]&&(k>Max)) ///如果 dp[k][j] 有值并且 k>Max 更新Max Max = k; } } } ///Max 代表从 n 个物品中最多可以选 Max 种物品 ///sum 代表有选 Max 个物品的总组合数 int sum = 0; for(i=0; i<=m; i++) sum += dp[Max][i]; if(!Max) printf("Sorry, you can‘t buy anything.\n"); else printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n", sum, Max); } return 0; }
(01背包)Buy the souvenirs (hdu 2126)
标签:
原文地址:http://www.cnblogs.com/YY56/p/5480869.html