|
小明要去商店买东西,他已经知道了要买东西的总价为S,现在他有n种硬币,每种硬币的面值为a1,a2,a3……an。他希望通过选用硬币使面值之和刚好为S,请问需要硬币数目的最小值和最大值。(1<=n<=100,0<=S<=10000,1<=ai<=S)<pre><xmp>输入数据有多组 每组数据有硬币种数n,总价S和n种硬币面值<pre><xmp>输出对应每组输入的硬币数目的最小值和最大值<pre><xmp>3 3 1 2 3 5 30 1 3 5 7 9<pre><xmp>1 3 4 30 #include <iostream> #include <stdio.h> #include <stdlib.h> #define inf 1000000; using namespace std; int n,s; int v[105]; int a[10005]; int b[10005]; void dp(int*,int*); int main() { while(cin>>n>>s) { for(int i=1; i<=n; i++) { cin>>v[i]; } dp(a,b); cout<<a[s]<<" "<<b[s]<<endl; }//cout << "Hello world!" << endl; return 0; } void dp(int *a,int *b) { a[0]=0; b[0]=0; for(int i=1; i<=s; i++) { a[i]=inf; b[i]=-inf; } for(int i=1; i<=s; i++) { for(int j=1; j<=n; j++) { if(i>=v[j]) { if(a[i]>a[i-v[j]]+1) a[i]=a[i-v[j]]+1; if(b[i]<b[i-v[j]]+1) b[i]=b[i-v[j]]+1; } } } //return 0; } |
1---处女篇----初学dp,找的代码--------硬币数目
最新推荐文章于 2018-03-31 17:36:52 发布