日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【9502】子集问题

發(fā)布時間:2023/12/31 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【9502】子集问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Time Limit: 10 second
Memory Limit: 2 MB

問題描述
子集和問題的一個實例為〈S,C 〉。其中,S={ X1 ,X2 ,…,Xn } 是一個正整數(shù)的集合,C是一個正整數(shù)。
編程任務 :對于給定的正整數(shù)的集合S={ X1 ,X2 ,…,Xn } 和正整數(shù)C,編程計算S 的一個子集S1 ,使得∑X (X∈S1) = C(子集s1的和等于c)

Input

第一行有2個正整數(shù)n和c,n表示s集合中元素的個數(shù),c是子集和的目標值。第二行有n個正整數(shù),表示集合s中的元素

Output

輸出一行數(shù)據(jù),是子集和問題的解,當問題無解時,輸出"No Solution!".(有解時,在解的后面多添加一個空格和一個換行符)

Sample Input

5 10 2 2 6 5 4

Sample Output

2 2 6 ?

【題解】

用一個sum來累加當前選擇的數(shù)。深搜下就可以了。用過的數(shù)不能再用,sum > c后剪枝。還有一個剪枝就是所有的數(shù)加起來仍然<c,這種時候直接輸出無解信息就可以了。

【代碼】

#include <cstdio> #include <stdlib.h>int n,c,a[5000],sum = 0,num = 0,ans[5001]; bool bo[5001];void input_data() {scanf("%d %d",&n,&c); //輸入n 和 cfor (int i = 1;i <= n;i++)scanf("%d",&a[i]),sum+=a[i]; //累加a[i]的和if (sum < c) //如果所有數(shù)之和仍小于c則輸出無解信息。{printf("No Solution!");exit(0);}if (sum == c) //如果所有的數(shù)剛好等于答案 則直接輸出所有的數(shù){for (int i = 1;i <= n;i++)printf("%d ",a[i]);exit(0);}sum = 0; //這里的sum用于搜索時候的累加for (int i = 1;i <= 5000;i++) //所有的數(shù)一開始都可以用bo[i] = true; }void output_ans() {for (int i = 1;i <= num;i++) //輸出答案printf("%d ",ans[i]); }void sear_ch(int t,int m) //t表示這個數(shù)的數(shù)值,m是這個數(shù)的下標 {bo[m] = false; //標記這個數(shù)已經(jīng)使用過sum += t; //累加當前選擇的數(shù)字ans[++num] = t; //記錄答案。if (sum == c) //如果累加和符合要求則輸出答案。{output_ans();exit(0);}if (sum < c) //如果sum小于c則繼續(xù)搜素,否則不搜索了 返回上一層for (int i = 1;i <= n;i++)if (bo[i]) //如果這個數(shù)字未被使用sear_ch(a[i],i);sum -= t; //回溯num--;bo[m] =true; }void get_ans() {for (int i = 1;i <= n;i++)sear_ch(a[i],i);printf("No Solution!"); //最后還要再輸出一次無解信息。 }int main() {input_data();get_ans();return 0; }


?

?

總結

以上是生活随笔為你收集整理的【9502】子集问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。