hdu2844

来源:互联网 发布:js控制video播放停止 编辑:程序博客网 时间:2024/05/18 01:18

题目


这道题,刚开始题没读懂,就是这句话:,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value ,

原本是A1,A2,A3...An 代表 价值

 C1,C2,C3...Cn  代表 数量

结果理解反了。题都读了一下午,真的是……唉……

题意:

一位同学想要买手表,他有n种硬币,每种硬币已知有num[i]个。已知手表的价钱最多m元,问她用这些钱能够凑出多少种价格来买手表。

又或是:

题意:Tony想要买一个东西,他只有n中硬币每种硬币的面值为a[i]每种硬币的数量为c[i]要买的物品价值不超过m

输入:第一行输入n和m,第二行输入n个硬币的面值和n个硬币的数量,输入0 0结束

输出:1到m之间有多少价格Tony可以支付

代码如下:

#include<stdio.h>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int N = 100+5;const int M =1e5+10;int value[N];int value1[M];int jian[N];int dp[M];int n,m;void solve(){    int cnt =0;    for(int i=1; i<=n; i++)    {        for(int j=1; j<=jian[i]; j<<=1)        {            value1[cnt]=value[i]*j;            jian[i]-=j;            cnt++;        }        if(jian[i]>0)        {            value1[cnt]=value[i]*jian[i];            cnt++;        }    }    for(int i=0; i<cnt; i++)        for(int j=m; j>=value1[i]; j--)        {            if(dp[j]<dp[j-value1[i]]+value1[i])            {                dp[j]=dp[j-value1[i]]+value1[i];            }        }    int sum=0;    for(int i=1; i<=m; i++)//不太理解    {        if(i==dp[i]) sum++;    }    printf("%d\n",sum);}int main(){   while(  ~scanf("%d%d",&n,&m))    {        if(n==0&&m==0) break;        memset(dp,0,sizeof(dp));        memset(value,0,sizeof(value));        memset(value1,0,sizeof(value1));        memset(jian,0,sizeof(jian));        for(int i=1; i<=n; i++)            scanf("%d",&value[i]);        for(int i=1; i<=n; i++)            scanf("%d",&jian[i]);        solve();    }    return 0;}有三句话是百度借鉴的:   for(int i=1; i<=m; i++)    {        if(i==dp[i]) sum++;    }


不太能理解?


另外:

最开始理解成了,要求凑出最大值时,硬币的个数:结果代码如下

#include<stdio.h>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int N = 100+5;const int M =1e4+10;int value[N];int value1[N*20];int need[N];int need1[N*20];int jian[N];int dp[M];int n,m;void solve(){     int cnt =0,ans;    for(int i=1;i<=n;i++){        for(int j=1;j<=jian[i];j<<=1)    {        value1[cnt]=value[i]*j;        need[cnt]=j;        jian[i]-=j;        cnt++;    }    if(jian[i]>0)    {        value1[cnt]=value[i]*jian[i];         need[cnt]=jian[i];        cnt++;    }    }    for(int i=0;i<cnt;i++)        for(int j=m;j>=value1[i];j--)    {           if(dp[j]<dp[j-value1[i]]+value1[i]){            dp[j]=dp[j-value1[i]]+value1[i];            need1[j]=need1[j-need[i]]+need[i];           }    }    printf("\n%d\n",need1[m]);}int main(){    while(  ~scanf("%d%d",&n,&m)){        if(n==0&&m==0) break;            memset(dp,0,sizeof(dp));            memset(need,0,sizeof(need));            memset(need1,0,sizeof(need1));    for(int i=1;i<=n;i++)        scanf("%d",&jian[i]);     for(int i=1;i<=n;i++)        scanf("%d",&value[i]);       solve();    }    return 0;}


原创粉丝点击