1. 程式人生 > >0-1揹包問題(動態規劃C語言實現)

0-1揹包問題(動態規劃C語言實現)

#include <stdio.h>
#include <stdlib.h>
#define WEIGHT 10
#define NUM 5

int main()
{
	int w[NUM + 1] = {0,2,2,6,5,4};
	int p[NUM + 1] = {0,6,3,5,4,6};
	int c[NUM + 1][WEIGHT + 1] = {0};

	for (int i = 1; i <= NUM; i++)
	{
		int k = i;
		for (int v = 1; v <= WEIGHT; v++)
		{
			if (w[i] <= v)
			{
				if (c[i - 1][v - w[i]] + p[i] > c[i - 1][v])
				{		
					c[i][v] =c[i - 1][v - w[i]] +  p[i];		
				}
				else
				{
					c[i][v] = c[i - 1][v];
				}
			}
			else
			{
				c[i][v] = c[i - 1][v];
			}

		}
	}
	
	int s[NUM + 1] = {0};
	for (int k = NUM, x = WEIGHT; k > 0; k--)
	{
		if (c[k - 1][x - w[k]] + p[k] > c[k - 1][x])
		{
			s[k] = 1;
			x = x - w[k];
		}
	}



	printf("%d\n", c[5][10]);

/*	for (int j = 1; j <= NUM; j++)
	{
		for (int i = 1; i <= WEIGHT; i++)	
			printf("%d ", c[j][i]);
		printf("\n");
	}
	printf("\n");
*/
	for (int yy = 1; yy <= NUM; yy++)
	{
		printf("%d ", s[yy]);
	}


	return 0;
}

相關推薦

0-1揹包問題動態規劃C語言實現

#include <stdio.h> #include <stdlib.h> #define WEIGHT 10 #define NUM 5 int main() { int w[NUM + 1] = {0,2,2,6,5,4}; int p[

0/1揹包問題動態規劃 空間複雜度是o(C)

有num個物品,總揹包容量為Capacity, 求不超過揹包總容量的前提下使得揹包裡的物品的價值達到最大的物品是哪些物品。 對於每個物品,只有兩種選擇,要麼裝要麼不裝進揹包。 那麼在考慮前 i 個物品

0-1揹包問題-動態規劃

    揹包問題可以使用動態規劃獲得最優解,動態規劃的思路是:通過獲得單階段的最優解後,升級到多階段,每次升級時都使用上一階段的最優解計算,避免遍歷所有可能時產生的時間消耗。 package test; import java.util.Ar

0-1揹包優化動態規劃演算法之跳躍點法

// 動態規劃 揹包問題 跳躍點優化 #include <iostream> using namespace std; template<class Type> void Traceback(int n,Type w[],Type v[]

0——1揹包問題動態規劃求解

轉自https://www.cnblogs.com/wujing-hubei/p/6376218.html?utm_source=tuicool&utm_medium=referral 這篇文章把動態規劃過程剖析的很好 基本思想: 動態規劃演算法通常用於求解具有某種

快速排序完整程式c語言實現

鍵碼序列(66,13,51,76,81,26,57,69,23)進行快速排序。 求第一趟劃分後的結果。 關鍵碼序列遞增。 以第一個元素為劃分基準。 【主要方法步驟】如下: 將兩個指標i,j分別

51Nod1085 0-1揹包一維和二維陣列實現

揹包是典型的動態規劃問題,關於揹包問題的詳解,推薦部落格:點選開啟連結(這篇部落格有點錯誤,程式碼for迴圈裡錯了,不過講解 的很詳細) 題目如下: 在N件物品取出若干件放在容量為W的揹包裡,每件物品的體積為W1,W2……Wn(Wi為整數),與之相對應的價值為P1,P2……Pn(Pi為整數)

0-1揹包 反向、概率HDOJ 2955

Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 31576    Accepted Submission(s

BZOJ5302 HAOI2018奇怪的揹包動態規劃

  由裴蜀定理,子集S有解當且僅當gcd(S,P)|w。   一個顯然的dp是設f[i][j]為前i個數gcd為j的選取方案。注意到這裡的gcd一定是P的約數,所以狀態數是n√P的。然後可以通過這個得到gcd是j約數的選取方案。複雜度O(n√PlogP)。   考慮優化。注意到每個數取gcd後的貢獻僅與其

01揹包問題c語言實現-回溯法求解

回溯法求解01揹包   用回溯法解問題時,應明確定義問題的解空間。問題的解空間至少應包含問題的一個(最優)解。例如,對於有n種可選擇物品的0-1揹包問題,其解空間由長度為n的0-1向量組成。該解空間

PAT Basic 1005. 繼續(3n+1)猜想C語言實現

題目 卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、5、8、4、2、1,則當我們對n=5、8、4、2進

0-1揹包回溯法剪枝版

#include<stdio.h> #define n 3 int maxvalue=0,tot=0; int w[n]={16,15,15},v[n]={45,25,25},c=30; int tempweight=0,tempvalue=0; void df

找零錢問題C語言實現——貪心演算法應用1

#include<stdio.h> void greedyMoney(int m[],int k,int n); int main(void) { int money[] = {20,10,5,1}; int k; k = sizeof(money)/sizeof(money[0]

二十四進制編碼串轉換為32位無符號整數C語言實現

bool while open 參數錯誤 hint div 第一個字符 bsp opened typedef int BOOL; #define TRUE 1; #define FALSE 0; #define UINT_MAX 0xffffffff

堆排序C語言實現

names 博客 鏈接 c語言實現 建立 ron 要求 clas [1] 之前的博客介紹介紹了數組的兩種排序算法:插入排序和歸並排序(採用遞歸),見鏈接http://blog.csdn.net/u013165521/article/detai

算法 - 棧與隊列C 語言實現

元素 語言 訪問規則 並且 下標 出棧 數據結構 規則 算法 目標: 理解 棧 與 隊列 這兩種數據結構, 並且知道如何應用。 算法 + 數據結構 = 程序 一、堆棧 堆棧是一組元素的集合,類似於數組,但數組可以按下標訪問,堆棧的訪問規則只能為push 與

歸並排序C語言實現

ngs 基本 merge 兩個 它的 efi 分別是 void rec 合並排序(MERGE SORT)是又一類不同的排序方法,合並的含義就是將兩個或兩個以上的有序數據序列合並成一個新的有序數據序列,因此它又叫歸並算法。 它的基本思想就是假

【BZOJ4872】分手是祝願動態規劃,數學期望

esp math map ostream pac mes ++i rac define 【BZOJ4872】分手是祝願(動態規劃,數學期望) 題面 BZOJ 題解 對於一個狀態,如何求解當前的最短步數? 從大到小枚舉,每次把最大的沒有關掉的燈關掉 暴力枚舉因數關就好 假設我

【BZOJ1415】【NOI2005】聰聰和可可動態規劃,數學期望

數學期望 class ios char for problem lin vector noi 【BZOJ1415】【NOI2005】聰聰和可可(動態規劃,數學期望) 題面 BZOJ 題解 先預處理出當可可在某個點,聰聰在某個點時 聰聰會往哪裏走 然後記憶化搜索一下就好了 #

【題解】 P1879 玉米田Corn Fields 動態規劃,狀態壓縮

bad sin 是否 editor infer nbsp 一行 als clas 題目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1