void getmoney(int m[],int k,int n
时间: 2023-12-31 07:03:43 浏览: 24
该函数的作用是从数组m中选取k个数,使得这k个数的和等于n,并将这k个数存入另一个数组中。可以参考以下代码实现:
```C++
void getmoney(int m[], int k, int n, int res[]) {
if (k == 0 || n == 0) {
return;
}
if (m[k - 1] > n) {
getmoney(m, k - 1, n, res);
} else {
getmoney(m, k - 1, n, res);
if (n >= m[k - 1]) {
res[k - 1] = m[k - 1];
getmoney(m, k - 1, n - m[k - 1], res);
}
}
}
```
其中,m是原始数组,k是需要选取的数的个数,n是目标和,res是存储结果的数组。函数实现的过程使用了递归的思想,对于每一个数,都有选或不选两种情况。如果当前数比目标和大,则直接跳过;否则分别处理选和不选两种情况。递归的边界条件是当k为0或n为0时,直接返回。
相关问题
优化代码运用线程知识package D18; public class D18_1 { public static void main(String[] args) { // TODO Auto-generated method stub } } class Account implements Runnable{ private int money; //修改方法 //存钱 public void deposit(int amount) { money +=amount; System.out.println("存钱成功,现有"+money); } @Override public void run() { // TODO Auto-generated method stub deposit(100); } public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } }
以下是对代码的优化,使用线程来实现存钱和查询余额的功能:
```
public class D18_1 {
public static void main(String[] args) throws InterruptedException {
Account account = new Account();
Thread depositThread = new Thread(() -> {
for (int i = 0; i < 10; i++) {
account.deposit(100);
}
});
Thread checkThread = new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println("当前余额为:" + account.getMoney());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
depositThread.start();
checkThread.start();
depositThread.join();
checkThread.join();
}
}
class Account {
private int money;
public synchronized void deposit(int amount) {
money += amount;
System.out.println("存钱成功,现有" + money);
}
public synchronized int getMoney() {
return money;
}
}
```
这里使用了 synchronized 关键字来保证线程安全,同时使用了 join() 方法来保证查询余额的线程在存钱线程执行完毕后才开始运行,避免了查询余额时余额数值不正确的问题。
tatic void printTotal(){ cout<<"total:"<<totalMoney<<endl; } static float totalMoney; }; float Donator::totalMoney=0; void Donator::setName(string _name){name=_name;} void Donator::setMoney(float _money){money=_money;totalMoney+=money;} string getMaxName(Donator dt[],int n){ float max=dt[0].getMoney(); string max_name = dt[0].getName(); for(int i=1;i<n;i++) if(dt[i].getMoney()>max){ max = dt[i].getMoney(); max_name = dt[i].getName(); } return max_name; }
这段代码是一个简单的捐赠者管理程序。其中 `Donator` 类表示一个捐赠者,包含了 `name` 和 `money` 两个私有属性,以及 `setName()` 和 `setMoney()` 两个公有方法用于设置捐赠者的姓名和捐款金额。`static float totalMoney` 表示所有捐款的总金额,是一个静态成员变量,可以通过 `setMoney()` 方法来累加。
`printTotal()` 是一个静态的公有方法,用于输出所有捐款的总金额。
`getMaxName()` 方法接收一个 `Donator` 类型的数组和数组长度 `n`,返回捐赠金额最大的捐赠者的姓名。
这个程序还有一些不足之处,比如 `setMoney()` 方法没有对传入的参数做有效性检查,还有可能存在多个捐赠者捐赠了相同金额的情况,这些都需要根据实际需求进行修改和完善。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)