砝码称重(dp)

来源:互联网 发布:tuigirl88最新域名 编辑:程序博客网 时间:2024/05/16 18:36
砝码称重

内容:

砝码称重(30分)

设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),

要求:

输入方式:a1 a2 a3 a4 a5 a6

(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)

输出方式:Total=N

(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)

如输入:1_1_0_0_0_0 (注:下划线表示空格)

输出:TOTAL=3 表示可以称出1g,2g,3g三种不同的重量。


#include <iostream>#include <stdio.h>#include <string>#include <string.h>#include <map>#include <algorithm>#include <math.h>#include <vector>#include <cstring>#include <cstdio>using namespace std;bool dp[1005];int num[7],size[7],sum;int main(){ num[1]=1;//虽然数组从零开始,这里赋值应该从一开始因为下面dp数组dp[0]=1,而dp[k]|=dp[k-num[i]]   num[2]=2;  num[3]=3;  num[4]=5;  num[5]=10;  num[6]=20;   int i,j,k,ans;  ans=sum=0; for(i=1;i<=6;i++){  scanf("%d",&size[i]);   sum+=num[i]*size[i];  }  memset(dp,0,sizeof(dp));  dp[0]=1;  for(i=1;i<=6;i++)   for(j=1;j<=size[i];j++)     for(k=sum;k>=num[i];k--)       dp[k]|=dp[k-num[i]];  for(i=sum;i>=1;i--){    if(dp[i])      ans++;  } printf("Total=%d\n",ans);  return 0;}


0 0
原创粉丝点击