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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

从给定的N个正数中选取若干个数之和最接近M

發布時間:2024/9/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从给定的N个正数中选取若干个数之和最接近M 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.ahathinking.com/archives/110.html

這道題跟撈魚問題一樣,都是剛進實驗室新生培訓那會兒做過的題目,不過這個是一師姐當時找工作的面試題。

如題,并輸出該子序列

測試用例:2,9,5,7,4,11,10

分別輸出最接近33、40、47、60的子序列

分析:N個數之和接近M,將M看做一個容量的背包,這個題目就變成了典型的01背包,M容量下求最優解并輸出最優方案,這在01背包中都整理過,上代碼:


#include <iostream> using namespace std;char state[11][101]; /* 設 N <= 10 M <= 100 記錄路徑 */ int dp[101]; /* 使用一維數組01背包 */ int value[11]; /* 本題可將費用與價值看做同一值 */ int i, j;void main() {int N, M;scanf("%d", &N);for(i = 0; i < N; ++i){scanf("%d",&value[i]);}while(scanf("%d", &M) != EOF){memset(dp,0,sizeof(dp));/* 01背包 */for(i = 0; i < N; ++i){for(j = M; j >= value[i]; --j){int tmp = dp[j-value[i]] + value[i];if(tmp > dp[j]){dp[j] = tmp;state[i][j] = 1;}}}printf("最接近值:%d\n",dp[M]);/* 輸出方案 */i = N;j = M;while(i-- >= 0){if(state[i][j] == 1){printf("%d ",value[i]);j -= value[i];}}printf("\n");} } 輸出結果如下圖

總結

以上是生活随笔為你收集整理的从给定的N个正数中选取若干个数之和最接近M的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。