砝码称重
题目描述
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000g)。求出用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况。
输入格式
只有一行,共有六个数,一次为1g、2g、3g、5g、10g、20g砝码的个数
输出格式
只有一行,为称出不同重量的个数
样例
样例输入
1 1 0 0 0 0
样例输出
Total=3
这个就是自己手搓背包(我认为是),从1000到0能满足的背包数量,这里拆分物品时尽量用二进制,避免出现大量小体积物品卡时间(例如逃亡的准备)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=10100;
const int maxw=10100000;
int n=0,m=0;
int f[maxw];//maxw为背包容量
int v[maxn];
int w[7]={0,1,2,3,5,10,20};
int num[maxn];
int cnt=0,sum=0;
int main(){
int vi,wi,imi;
for(int i=1;i<=6;i++){//将物品用二进制的方法拆分 ,转化成01背包
cin>>imi;
for(int j=1;j<=imi;j*=2){
v[++cnt]=j*w[i];
imi-=j;
}
if(imi>0){
v[++cnt]=imi*w[i];
}
}
f[0]=1;//容量为0的背包可以满足
for(int i=1;i<=cnt;i++){
for(int j=1000;j>=v[i];j--) f[j]=f[j]||f[j-v[i]]; //||表示有任意一种情况成立它就成立,&&表示两种情况都成立时才成立
}
for(int i=1;i<=1000;i++) sum+=f[i];
cout<<"Total="<<sum;
}

浙公网安备 33010602011771号