输入:第一行,输入试题数量n(n<=10);
按顺序输入各个试题的分值v;
输出:第一行输出选择的个数;
按从小到大的顺序输出选择试题的序号。
思路:这道题是没有规律可循的,由于数量n不大于10,每个题都存在0/1两种状态,最多也就是pow(1,10)=1024种情况,所以采取暴力解决。
#include <IOSTREAM> #include <VECTOR> #include <MATH.H> #define max(a,b) a>b?a:b using namespace std; int main() { int sum=0,n,f[11]={0}; cin>>n; vector<int> res; res.push_back(0);//不使用res[0] for (int i=1;i<=n;i++) { int temp; cin>>temp; res.push_back(temp); } for( i=1;i<pow(2,n);i++) { int t=i; for (int j=1;j<=n;j++) { f[j]=t&1;//按位与,判断是否选择当前题型 t=t>>1; } sum=f[1]*res[1]+f[2]*res[2]+f[3]*res[3]+f[4]*res[4]+f[5]*res[5]+f[6]*res[6]+f[7]*res[7]+f[8]*res[8]+f[9]*res[9]+f[10]*res[10]; if(sum==100) { cout<<"yes"<<endl; for (i=1;i<=10;i++) { if (f[i]==1) { cout<<i<<' ';//按顺序输出序号 } } return 0; } } cout<<"no"<<endl; return 0; }