<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      222. 多重部分和問題(挑戰程序設計競賽)

      地址 https://www.papamelon.com/problem/222

      有 n 種不同大小的數字 a_i,每種各 m_i個。
      判斷是否可以從這些數字之中選出若干個并使得它們的和恰好為 K
      
      輸入
      第一行包含兩個整數 n 和 K
      第二行包含 n 個數表示 a 數組
      第三行一行包含 n 個數表示 m 數組
      1≤n≤100
      1≤a i,m i ≤10^5
      1≤K≤10^5
       
      輸出
      輸出 Yes 或 No
      提示
      2021/12/07 加強數據,可嘗試重新提交
      樣例 1
      輸入
      3 17
      3 5 8
      3 2 2
      輸出
      Yes
      

      解答 dp方法
      常規經典動態方案
      dp[i][j] 表示前i個物品湊成數目j能否成功 1表示成功 0表示失敗
      那么

      dp[i][j] = max(dp[i-1][j],dp[i-1][j-ai],dp[i-1][a-2*ai]~~~,dp[i-1][j-k*ai]);
      但是整個復雜度是O(n*K*m) 超時.
      超時代碼 TLE
      
      #include <iostream>
      
      using namespace std;
      
      const int N = 105;
      int n, K;
      int dp[N][100010];
      int a[N];
      int m[N];
      
      int main()
      {
      	cin >> n >> K;
      	for (int i = 1; i <= n; i++) cin >> a[i];
      	for (int i = 1; i <= n; i++) cin >> m[i];
      	dp[0][0] = 1;
      	for (long long i = 1; i <= n; i++) {
      		for (long long j = 0; j <= K; j++) {
      			if (dp[i - 1][j] > 0)dp[i][j] = 1;
      			else {
      				for (int k = 1; k <= m[i]; k++) {
      					if (j >= (long long)k * a[i]) {
      						dp[i][j] += dp[i-1][j - k * a[i]];
      						if (dp[i][j] > 0) break;
      					}
      				}
      			}
      		}
      	}
      
      	if (dp[n][K] > 0) cout << "Yes" << endl;
      	else cout << "No" << endl;
      
      
      	return 0;
      }
      

      代碼中,第三重循環 for (int k = 1; k <= m[i]; k++)
      實際計算的是 第i個數字使用了幾次,那么可以考慮使用dp[i][j]記錄下第i個數字達到j的和的時候,第i個數字使用了幾個,就可以優化掉第三重循環
      此時dp[i][j] 表示的意義不再是dp[i][j] 表示前i個物品湊成數目j能否成功 1表示成功 0表示失敗
      而是 前 i 個數字湊成數目j,第 i 個數字使用了幾個

      
      #include <iostream>
      
      using namespace std;
      
      const int N = 105;
      int n, K;
      int dp[N][100010];
      int a[N];
      int m[N];
      
      
      //dp[i][j]表示前i個數字達到j的和時候 第i個數字使用的最小值
      int main() {
      	cin >> n >> K;
      	for (int i = 1; i <= n; i++) cin >> a[i];
      	for (int i = 1; i <= n; i++) cin >> m[i];
      	 
      	memset(dp,-1,sizeof dp);
              dp[0][0]=1;
      	for (int i = 1; i <= n; i++) {
      		for (int j = 0; j <= K; j++) {
      			if (dp[i - 1][j] >= 0) dp[i][j] = 0;
      			if (dp[i][j] == -1 && j >= a[i]&&dp[i][j-a[i]]>=0) {
      				if (dp[i][j - a[i]] + 1 <= m[i]) {
      					dp[i][j] = dp[i][j - a[i]] + 1;
      				}
      			}
      		}
      	}
      
      	//cout << dp[n][K] << endl;
      	if (dp[n][K] >= 0) cout << "Yes" << endl;
      	else cout << "No" << endl;
      
      
      	return 0;
      }
      
      

      posted on 2023-01-09 14:10  itdef  閱讀(35)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 无码激情亚洲一区| 深夜av在线免费观看| 国产精品免费观看色悠悠| 蜜桃av亚洲精品一区二区| 自拍视频亚洲精品在线| 日韩放荡少妇无码视频| 夜夜添无码试看一区二区三区| 久久热在线视频精品视频| 亚洲高清国产拍精品网络战| 人妻少妇精品无码专区二区| 亚洲人成电影在线天堂色| 久热视频这里只有精品6| 老司机午夜精品视频资源| 国产对白老熟女正在播放| 亚洲精品国产精品国在线| 日韩成人无码影院| 朝鲜女子内射杂交bbw| 五月综合婷婷开心综合婷婷| 亚洲AV成人片在线观看| 成人做受120秒试看试看视频 | 国产gaysexchina男外卖| 国产普通话对白刺激| 亚洲天堂av在线免费看| 成 人 色 网 站免费观看| 内射干少妇亚洲69xxx| 在线日韩日本国产亚洲| 午夜高清福利在线观看| 蜜臀午夜一区二区在线播放| 国产乱色国产精品免费视频| 亚洲五月天一区二区三区| 制服丝袜长腿无码专区第一页 | 亚洲av在线观看| 熟女一区二区中文在线| 国产中文字幕在线一区| 亚洲一区二区精品偷拍| 国模雨珍浓密毛大尺度150p| 许昌县| 久久天天躁狠狠躁夜夜avapp| 国产内射性高湖| 伊人中文在线最新版天堂| 欧美人与动zozo|