Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
完全背包化为 0 1 背包思路#include<iostream> #include<vector> using namespace std; bool dp[100010];// 状态数组 dp[i] 表示可以组成价值i int theUseOFcoins_i[100010];// 当执行到第i步时,第m个元素表示当前值使用 value[i]的数目 int GetResult(int value[], int NumOfCoin[], int N, int M) { memset(dp, 0, sizeof(dp)); //初始化为0 dp[0] = true;// 0价值总可以组成 int result = 0; for (int i = 1; i <= N; i++) { memset(theUseOFcoins_i, 0, sizeof(theUseOFcoins_i)); //第i步将完成的工作: // 对于价值为 value[i-1] 的硬币,其个数为 NumOFCoin[i-1],将其视为不同的元素 (0 1背包)可以取,可以不取 //根据之前的已经组成的价值,判断能否组成新的价值 for (int j = value[i-1]; j <= M; j++) { //当满足 之前可以组成价值 j-value[i-1],且价值 j 没有组成,且之前组成价值i时使用的value[i-1] 的数目小于 theUseOFcoins[i-1] if (dp[j] == false && dp[j - value[i - 1]] == true && theUseOFcoins_i[j-value[i-1]] < NumOfCoin[i - 1]) { //那么价值 j 可以组成,且组成价值 所使用的value[i-1] 类型硬币 +1 dp[j] = true; result++; theUseOFcoins_i[j] = theUseOFcoins_i[j-value[i-1]] + 1; } //对于使用多个 value[i-1] 硬币,其在对应价值处的使用数目均被合理赋值为 0 1 2 ... } } return result; } int main() { int N, M; vector<int> result; while (cin >> N >> M) { if (N == 0 && M == 0) break; int *value = new int[N]; int *NumOFCoin = new int[N]; for (int i = 0; i < N; i++) cin >> value[i]; for (int j = 0; j < N; j++) cin >> NumOFCoin[j]; result.push_back(GetResult(value, NumOFCoin, N, M)); delete[]value; delete[]NumOFCoin; } for (int i = 0; i < result.size(); i++) cout << result[i] << endl; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator