1068. Find More Coins (30)

102 篇文章 0 订阅
37 篇文章 0 订阅

1068. Find More Coins (30)

时间限制
150 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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 1
Sample Output 1:
1 3 5
Sample Input 2:
4 8
7 2 4 3
Sample Output 2:
No Solution
N个钱币,要买goal元的东西
接着是乱序的钱币;
求满足可以正好不找零的情况,有给出把零钱最少的用的最多的那条;
                        没有No Solution
第一个用了DFS,第二个01背包,一个从小到大,找到直接结束;一个从大到小,全结束后如果符合条件,显然是小的覆盖在大的上面

评测结果

时间结果得分题目语言用时(ms)内存(kB)用户
8月14日 09:30答案正确301068C++ (g++ 4.7.2)4384datrilla

测试点

测试点结果用时(ms)内存(kB)得分/满分
0答案正确130816/16
1答案正确13081/1
2答案正确13045/5
3答案正确43082/2
4答案正确33844/4
5答案正确13041/1
6答案正确13001/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答案正确301068C++ (g++ 4.7.2)71192datrilla

测试点

测试点结果用时(ms)内存(kB)得分/满分
0答案正确118016/16
1答案正确11801/1
2答案正确11805/5
3答案正确711922/2
4答案正确710764/4
5答案正确13081/1
6答案正确13081/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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值