The Fewest Coins POJ - 3260

如果行号影响了复制,请点击代码框左上角的按钮。

The Fewest Coins POJ - 3260

完全背包+多重背包。基本思路是先通过背包分开求出"付出"指定数量钱和"找"指定数量钱时用的硬币数量最小值,然后枚举找的钱,那么付出的钱也随之确定,对于每个枚举出的找的钱可以得到一个答案,那么枚举所有可能的找的钱取答案的最大值即可。

这里有一个对于找钱上限的证明。如果不知道,也可以随便搞一个(比如以下用的10000,注意空间,试过5000可以过)。

复制代码
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,m,T,v[110],c[110],p[11000],ans[21200],anss=0x3f3f3f3f;
 6 int main()
 7 {
 8     int i,j;
 9     scanf("%d%d",&n,&T);
10     memset(ans,0x3f,sizeof(ans));
11     memset(p,0x3f,sizeof(p));
12     for(i=1;i<=n;i++)
13         scanf("%d",&v[i]);
14     for(i=1;i<=n;i++)
15         scanf("%d",&c[i]);
16     p[0]=0;
17     for(i=1;i<=10000;i++)
18     {
19         for(j=1;j<=n;j++)
20             if(i>=v[j])
21                 p[i]=min(p[i],p[i-v[j]]);
22         p[i]++;
23     }
24     ans[0]=0;
25     for(i=1;i<=n;i++)
26     {
27         m=1;
28         while(c[i]>0)
29         {
30             if(m>c[i])    m=c[i];
31             c[i]=c[i]-m;
32             for(j=T+10000;j>=v[i]*m;j--)
33             {
34                 ans[j]=min(ans[j],ans[j-v[i]*m]+m);
35                 if(j>=T)
36                     anss=min(anss,ans[j]+p[j-T]);
37             }
38             m<<=1;
39         }
40     }
41     if(anss!=0x3f3f3f3f)
42         printf("%d",anss);
43     else
44         printf("-1");
45     return 0;
46 }
复制代码
posted @   hehe_54321  阅读(211)  评论(0编辑  收藏  举报
编辑推荐:
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· Tinyfox 简易教程-1:Hello World!
AmazingCounters.com
点击右上角即可分享
微信分享提示