內容:
砝碼稱重(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三種不同的重量。
來源 :
NOIP1996
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int main(){ bool dp[2000]; int c[2000], num[7]; int weight[7] = {0, 1, 2, 3, 5, 10, 20}; //while(1) { int i, j, sum = 0; memset(dp,0,sizeof(dp)); for(i = 1; i <= 6; i++) { scanf("%d",&num[i]); sum += num[i] * weight[i]; } c[0] = 0; for(i = 1; i <= 6; i++) { for(j = 1; j < num[i]; num[i] -= j, j <<= 1) c[++c[0]] = weight[i] * j; if(num[i]) c[++c[0]] = weight[i] * num[i]; } dp[0] = 1; for(i = 1; i <= c[0]; i++) for(j = sum; j >= c[i]; j--) dp[j] = (dp[j] || dp[j-c[i]]); int ret = 0; for(i = 1; i <= sum; i++) ret += dp[i]; printf("Total=%d\n",ret); }} 1237 - 砝碼稱重給你一些砝碼,砝碼的重量為1,3,9,27……(3^m),每個砝碼都有無數多個。然後給你一架天平,一個物品,問你至少需要使用多少個砝碼能稱出物品的重量。問題描述輸入說明多組測試範例,每組測試範例輸入一個數n(0<n<2^31)表示物品的重量。輸出說明對於每組測試範例輸出至少需要使用砝碼的數量。輸入範例
479
輸出範例
231
題解: 貪心,先放最大的。
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;unsigned int power[35], cnt;int main(){ unsigned int s = 1, limit = ((unsigned int)1<<31); for(cnt = 0; s <= limit; s *= 3) power[cnt++] = s; unsigned int n; while(scanf("%d",&n) != EOF) { unsigned int sum = 0, i; while(n > 0) { for(i = cnt - 1; i >= 0; i--) if(power[i] <= n) break; sum += n / power[i]; n %= power[i]; } printf("%d\n",sum); } return 0;}