题目描述:
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重≤1000),
输入格式:
输入方式:a1,a2,a3,a4,a5,a6
(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
输出格式:
输出方式:Total=N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
输入输出样例:
输入 #1复制
1 1 0 0 0 0
输出 #1复制
Total=3
AC Code:
#include<bits/stdc++.h> using namespace std; #define N 1500 int dp[N],a[N]; int weight[7]={0,1,2,3,5,10,20};//6种砝码 int ans; int main() { for(int i=1;i<=6;i++) { scanf("%d",&a[i]); } dp[0]=1;//总重量为0即一个砝码也不用,我们将这种情况设为已有 for(int i=1;i<=6;i++) {//枚举6种砝码 for(int j=1;j<=a[i];j++) {//第i种砝码的个数 for(int k=1000;k>=0;k--) {//总重量 /*当k=0的时候,f[1]就会被标记为成立 但接下来,当k=1的时候,f[2]也会被标记为成立 那么是不是一遍扫过去,f[1~1000]全部都被标记为成立了呢! 所以仔细想想:一定是倒序,而不是正序!!!*/ if(dp[k]) {//若此重量成立 dp[k+weight[i]]=1;//那么这个重量加上这个未使用的砝码的总重量也成立 } } } } for(int i=1;i<=1000;i++) {//遍历所有重量(从1开始,因为不使用砝码的情况不算在内) if(dp[i]) {//记录可以使用砝码称出的重量 ans++; } } printf("Total=%d\n",ans); return 0; }