11,189
社区成员
发帖
与我相关
我的任务
分享
def money_num(m):
a,b,c=1,5,10
if m<5:
print(f'小A需要{m}枚1元硬币')
if m<10:
print(f'小A需要1枚五元硬币和{m-5}枚1元硬币')
if m>10:
print(f'小A需要{m//10}枚10元硬币和{(m%10)//5}枚5元硬币和{(m%10)%5}枚1元硬币')
money_num(187)
public void plansB(){
Scanner input=new Scanner(System.in);
//商品总价
int cap= 31;
//硬币各个面值
int w[]=new int[]{1,2, 8, 4, 16};
//硬币个数
int n=w.length;
//列出携带n个硬币能达到总价
int[][] vmax=new int[n+1][cap+1];
//标记可放入的记录
int[][] records=new int[n+1][cap+1];
//标记是否有满足的条件
boolean flag=false;
//依次列出
for (int i = 1;i<=n;i++) {
//查看面值组合
for (int j = 1; j<=cap;j++) {
//放入第i个硬币时
// 1.超出最大容量,则不能放入,依然保持上次放入的价值
// 2.可以选择放或不放,看价值是否更合适;
if((w[i-1])>j){
vmax[i][j]=vmax[i-1][j];
}else if(vmax[i-1][j]<w[i-1]+vmax[i-1][j-w[i-1]]){
vmax[i][j]=w[i-1]+vmax[i-1][j-w[i-1]];
records[i][j]=1;
flag=true;
}else {
vmax[i][j]=vmax[i-1][j];
}
}
}
// 输出最优解
if (!flag) {
System.out.println("No answer!!!");
return;
}
//输出每个位置的最优解
while (n>0&&cap>0) {
if(records[n][cap]==1){
System.out.println("携带硬币"+w[n-1]);
cap=cap-w[n-1];
}
n--;
}
}
public void plansB(){
Scanner input=new Scanner(System.in);
//商品总价
int cap= 31;
//硬币各个面值
int w[]=new int[]{1,2, 8, 4, 16};
//硬币个数
int n=w.length;
//列出携带n个硬币能达到总价
int[][] vmax=new int[n+1][cap+1];
//标记可放入的记录
int[][] records=new int[n+1][cap+1];
//标记是否有满足的条件
boolean flag=false;
//依次列出
for (int i = 1;i<=n;i++) {
//查看面值组合
for (int j = 1; j<=cap;j++) {
//放入第i个硬币时
// 1.超出最大容量,则不能放入,依然保持上次放入的价值
// 2.可以选择放或不放,看价值是否更合适;
if((w[i-1])>j){
vmax[i][j]=vmax[i-1][j];
}else if(vmax[i-1][j]<w[i-1]+vmax[i-1][j-w[i-1]]){
vmax[i][j]=w[i-1]+vmax[i-1][j-w[i-1]];
records[i][j]=1;
flag=true;
}else {
vmax[i][j]=vmax[i-1][j];
}
}
}
// 输出最优解
if (!flag) {
System.out.println("No answer!!!");
return;
}
//输出每个位置的最优解
while (n>0&&cap>0) {
if(records[n][cap]==1){
System.out.println("携带硬币"+w[n-1]);
cap=cap-w[n-1];
}
n--;
}
}
$n = trim(fgets(STDIN));
$m = trim(fgets(STDIN));
$coins = array_map('intval', explode(' ', trim(fgets(STDIN))));
// 将硬币从小到大排序
sort($coins);
$dp = array_fill(0, $m + 1, PHP_INT_MAX); // 初始化,dp[i] 表示凑成金额 i 所需的最少硬币数
$dp[0] = 0;
for ($i = 1; $i <= $m; $i++) {
for ($j = 0; $j < $n; $j++) {
if ($coins[$j] > $i) { // 面值大于当前金额,不用考虑
break;
}
if ($dp[$i - $coins[$j]] != PHP_INT_MAX) { // 凑不成的面值,不用考虑
$dp[$i] = min($dp[$i], $dp[$i - $coins[$j]] + 1); // 转移方程
}
}
}
echo $dp[$m] != PHP_INT_MAX ? $dp[$m] : 'No answer!!!'; // 判断是否有解
#include<stdio.h>
void sort(int a[],int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
{
for(j=i;j<n;j++)
{
if(a[i]<a[j])
{
k=a[i],a[i]=a[j],a[j]=k;
}
}
}
}
int main()
{
void sort(int a[],int n);
int n,m,temp;
scanf("%d%d",&n,&m);
int i,j,k=0,a[1001];
//printf("%d%d",n,m);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,n);
for(i=0;i<n;i++)
printf("%d",a[i]);
for(i=0;i<n;i++)
{
k=m/a[i]+k,m=m%a[i];
if(m==0)break;
}
printf("%d",k);
return 0;
}
n, m = map(int, input().split())
coins = list(map(int, input().split()))
# 初始化一个列表,存放从1到m元所有价格需要的最少硬币数
min_coins = [float('inf')] * (m+1)
# 0元不需要硬币
min_coins[0] = 0
# 外循环遍历所有可能的价格(从小到大)
for i in range(1, m+1):
# 内循环尝试使用每个硬币更新最少硬币数
for j in range(n):
if coins[j] <= i:
current = min_coins[i-coins[j]] + 1
if current < min_coins[i]:
min_coins[i] = current
if min_coins[m] == float('inf'):
print("No answer!!!")
else:
print(min_coins[m])
printf("No answer!!!");
这个页面的评论翻起来,还挺多的
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int m;
scanf("%d %d\n", &n, &m); //n为硬币的个数
int a[n];
int i;
int j;
int q;
for(i = 0; i < n; i++) {
scanf("%d", &a[i]); //每个硬币的面值
}
for(j = 0; j < n - 1; j++) {
for(i = 0; i < n - 1 - j; i++) {
if(a[i] > a[i+1]) {
int t;
t = a[i];
a[i] = a[i+1];
a[i+1] = t;
}
}
}
for(i = 0; i < n; i++) {
printf("%d ", a[i]); //每个硬币的面值
}
printf("\n");
for(j = 1; j <= m; j++) { //m为总价格
if(a[0] * j == m) {
printf("min需%d枚 ", i);
}
}
int sum = 0;
int sum1 = 0;
int m1 = m;
for(i = 0; i < n; i++) {
int flag = 0;
for(j = 1; j <= m1; j++) {
if(a[i] * j > m1) {
flag = 1;
}
if(flag == 1) {
q = j - 1;
break;
}
}
sum1 = sum1 + q; //sum1为最少需要的硬币数
sum = sum + a[i] * q; //sum为硬币的总面值
if(sum >= m) {
break;
}
m1 = m;
m1 = m1 - sum; //m1为剩下的价格
//printf("%d ", m1);
}
printf(" 1..最少需%d枚 ", sum1);
if(m1 > 0) {
printf("需要找零,无解");
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int m;
scanf("%d %d\n", &n, &m); //n为硬币的个数//
int a[n];
int i;
int j;
int q;
for (i = 0; i < n; i++) {
scanf("%d", &a[i]); //每个硬币的面值//
}
for (j = 0; j < n - 1; j++) {
for (i = 0; i < n - j - 1; i++) {
int t;
if (a[i] > a[i + 1]) {
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
for (i = 0; i < n; i++) {
printf("%d ", a[i]); //每个硬币的面值//
}
for (j = 1; j <= m; j++) { //m为总价格//
if (a[0] * j == m) {
printf("min需%d枚 ", i);
}
}
int sum = 0;
int sum1 = 0;
int m1 = m;
for (i = 0; i < n; i++) {
int flag = 0;
for (j = 1; j <= m1; j++) {
if (a[i] * j > m1) {
flag = 1;
}
if (flag == 1) {
q = j - 1;
break;
}
}
sum1 = sum1 + q; //sum1为最少需要的硬币数//
sum = sum + a[i] * q; //sum为硬币的总面值//
if (sum >= m) {
break;
}
m1 = m;
m1 = m1 - sum; //m1为剩下的价格//
}
printf(" 最少需%d枚 ", sum1);
return 0;
}
No answer!!!
#include <stdio.h>
int main()
{
int n;
int m;
scanf("%d %d\n",&n,&m);//n为硬币的个数//
int a[n];
int i;
int j;
int q;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);//每个硬币的面值//
}
for(j=0;j<n-1;j++)
{
if(a[j]>a[j+1])
{
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(i=0;i<n;i++)
{
printf("%d ",a[i]);//每个硬币的面值//
}
for(j=1;j<=m;j++){ //m为价格//
if(a[0]*j==m){
printf("min需%d枚 ",j);
}
}
int sum=0;
int sum1=0;
int m1=m;
for(i=n-1;i>=0;i--)
{
int flag=0;
for(j=1;j<=m1;j++){
if(a[i]*j>m1){
flag=1;
}
if(flag==1){
q=j-1;
break;
}
}
sum1=sum1+q; //sum1为最少需要的硬币数//
sum=sum+a[i]*q;
if(sum>=m){
break;
}
m1=m;
m1=m1-sum;
}
printf(" 最少需%d枚 ",sum1);
return 0;
}
这是一个经典的硬币找零问题(Coin Change Problem)。下面介绍一种动态规划的解法。
设 $f(i)$ 表示凑出价值 $i$ 的最小硬币数目。对于每个 $i$,我们枚举最后一枚使用的硬币的值 $a_j$,那么
$$f(i)=\min_{j}{f(i-a_j)+1|(i\ge a_j)}$$
初始化:$f(0)=0$,其余 $f(i)$ 值为正无穷。最终答案为 $f(m)$。
时间复杂度为 $O(nm)$,空间复杂度为 $O(m)$,其中 $n$ 是硬币的种数,$m$ 是给定的最大价格。
下面是Python代码实现:
def coin_change(coins, m):
dp = [0] + [float('inf')] * m
for i in range(1, m + 1):
for coin in coins:
if i >= coin:
dp[i] = min(dp[i], dp[i - coin] + 1)
return dp[m]
使用时,将硬币列表和最大价格 $m$ 作为参数传递即可:
coins = [1, 2, 5]
m = 11
print(coin_change(coins, m))
输出结果为 3,也就是说,最少需要三枚硬币就可以组合成所有可能的价格。
5
为什么我在pychar可以运行我的程序,到这就不行了
没有面币的数值
输入样例
6 63
1 2 4 8 16 32
输出样例:
6
No answer!!!
没硬币面值,无解