1068. Find More Coins (30)
Eva loves to collect coins from all over the universe, including some other planets like Mars. One day she visited a universal shopping mall which could accept all kinds of coins as payments. However, there was a special requirement of the payment: for each bill, she must pay the exact amount. Since she has as many as 104 coins with her, she definitely needs your help. You are supposed to tell her, for any given amount of money, whether or not she can find some coins to pay for it.
Input Specification:
Each input file contains one test case. For each case, the first line contains 2 positive numbers: N (<=104, the total number of coins) and M(<=102, the amount of money Eva has to pay). The second line contains N face values of the coins, which are all positive numbers. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print in one line the face values V1 <= V2 <= ... <= Vk such that V1 + V2 + ... + Vk = M. All the numbers must be separated by a space, and there must be no extra space at the end of the line. If such a solution is not unique, output the smallest sequence. If there is no solution, output "No Solution" instead.
Note: sequence {A[1], A[2], ...} is said to be "smaller" than sequence {B[1], B[2], ...} if there exists k >= 1 such that A[i]=B[i] for all i < k, and A[k] < B[k].
Sample Input 1:8 9 5 9 8 7 2 3 4 1Sample Output 1:
1 3 5Sample Input 2:
4 8 7 2 4 3Sample Output 2:
No Solution
N个钱币,要买goal元的东西
接着是乱序的钱币;
求满足可以正好不找零的情况,有给出把零钱最少的用的最多的那条;
没有No Solution
第一个用了DFS,第二个01背包,一个从小到大,找到直接结束;一个从大到小,全结束后如果符合条件,显然是小的覆盖在大的上面
评测结果
时间 | 结果 | 得分 | 题目 | 语言 | 用时(ms) | 内存(kB) | 用户 |
---|---|---|---|---|---|---|---|
8月14日 09:30 | 答案正确 | 30 | 1068 | C++ (g++ 4.7.2) | 4 | 384 | datrilla |
测试点
测试点 | 结果 | 用时(ms) | 内存(kB) | 得分/满分 |
---|---|---|---|---|
0 | 答案正确 | 1 | 308 | 16/16 |
1 | 答案正确 | 1 | 308 | 1/1 |
2 | 答案正确 | 1 | 304 | 5/5 |
3 | 答案正确 | 4 | 308 | 2/2 |
4 | 答案正确 | 3 | 384 | 4/4 |
5 | 答案正确 | 1 | 304 | 1/1 |
6 | 答案正确 | 1 | 300 | 1/1 |
#include <iostream> #include<algorithm> #include<vector> using namespace std; int readl(vector<int>*coins, int N) { int sum = 0; while (N--) { cin >> (*coins)[N]; sum += (*coins)[N]; } return sum; } void printft(vector<int>*ans, int len) { cout << (*ans)[0] ; for (int index = 1; index < len; index++) cout << " " << (*ans)[index]; cout << endl; } bool COINScmp(const int &A, const int &B){ return A < B; } bool coinsDFS(vector<int>*coins, vector<int>*ans, int N, int goal, int now,int nowsum,int*sum) { bool flag = false; while (now < N && (*coins)[now] + nowsum <= goal) { ans->push_back((*coins)[now]); if ((*coins)[now] + nowsum < goal) flag = coinsDFS(coins, ans, N, goal, now+1, (*coins)[now] + nowsum,sum); else if ((*coins)[now] + nowsum == goal) { (*sum) = goal; return true; } if (flag == true&&(*sum)==goal)return flag; ans->pop_back(); now++; } return flag; } int main() { int N, sum, goal; bool flag = false; cin >> N >> goal; vector<int>coins(N); vector<int>ans; sum = readl(&coins, N); if (sum < goal)flag = true; else if (sum == goal)printft(&coins, N); else { sort(coins.begin(), coins.end(), COINScmp); if (coinsDFS(&coins, &ans,N, goal,0,0,&sum))printft(&ans, ans.size()); else flag = true; } if (flag)cout << "No Solution" << endl; system("pause"); return 0; }
评测结果
时间 结果 得分 题目 语言 用时(ms) 内存(kB) 用户 8月14日 10:22 答案正确 30 1068 C++ (g++ 4.7.2) 7 1192 datrilla 测试点
测试点 结果 用时(ms) 内存(kB) 得分/满分 0 答案正确 1 180 16/16 1 答案正确 1 180 1/1 2 答案正确 1 180 5/5 3 答案正确 7 1192 2/2 4 答案正确 7 1076 4/4 5 答案正确 1 308 1/1 6 答案正确 1 308 1/1 #include<iostream> #include<vector> #include <algorithm> using namespace std; bool COINcmp(int a, int b) { return a > b; } int main() { int n, m; cin >> n >> m; vector<int>coins(n+1); vector<int>dp(m + 1,0); vector<vector<bool>>choice(n + 1) ; vector<int>ans; for (int i = 1; i <= n; i++) { cin >> coins[i]; choice[i].resize(m + 1); } sort(coins.begin() + 1, coins.begin()+ n + 1,COINcmp); for (int i = 1; i <= n; i++)/*dp递归方程*/ { /*这里的钱币已经从大到小排好序了,题目要最小的先用,所以越后面满足的coins[i]会覆盖前面的*/ for (int value = m; value >= coins[i]; value--) {/*对于钱coins[i],根据题意要没有找零,所以coins[i]只能用在价值在value=m~coins[i]*/ if (dp[value] <= dp[value - coins[i]] + coins[i]) { dp[value] = dp[value - coins[i]] + coins[i]; choice[i][value] = true; } else choice[i][value] = false; } } if (dp[m] != m) cout << "No Solution" << endl; else { while (n > 0) { if (choice[n][m]) { ans.push_back(coins[n]); m-= coins[n]; } n--; } n = 0; cout << ans[n++]; while (n < ans.size()) cout << " " << ans[n++]; cout << endl; } system("pause"); return 0; }